2011-08-02 10 views
6

Próbuję "ładnie" wyświetlać ułamki w mojej aplikacji na iPhone'a. Wcześniej używałem żmudnej instrukcji przełączania prowadzącej do zakodowanych znaków Unicode dla wulgarnych frakcji, ale nauczyłem się o znaku ułamkowym, który, jeśli dobrze rozumiem, powinien oznaczać, że mogę utworzyć ciąg w następujący sposób:Przedstawienie NSString ułamków przy użyciu Unicode

[NSString stringWithFormat:@"%i\u2044%i",numerator,denominator]; 

A "renderer" automatycznie wydrukuje go za pomocą mniejszego, superscripowanego licznika i indeksu dolnego. Jednak powyższy kod daje mi tylko standardowy wygląd 1/2. Używam drawAtPoint do umieszczenia napisu na ekranie. Eksperymentowałem z dekompozycjąStringUsingCanonicalMapping i prekompozycjąStringUsingCanonicalMapping, ale szczerze mówiąc utraciłem dokumentację.

Czy to działa, czy rysunek NSString nie radzi sobie z tym?

Odpowiedz

1

Nie jestem w żaden sposób świadomy, że postać w Unicode ma właściwości, które opisujesz. AFAIK jedyną rzeczą, która odróżnia U + 2044 od zwykłego ukośnika jest to, że jest nieco bardziej kątowe i ma mało miejsca na dowolną stronę, przez co staje się dużo bliżej otaczających liczb.

Here's a page na używanie Fraction Slash w HTML, a jak widać pokazuje, że po prostu dostajesz coś w rodzaju "1/10", jeśli spróbujesz użyć go samodzielnie. To rekompensuje za pomocą tagów <sup> i <sub> w HTML na otaczających liczb, aby uzyskać odpowiedni wyświetlacz.

Abyś mógł uruchomić to w NSString, będziesz musiał wymyślić jakiś sposób zastosowania superskryptowania i indeksowania do otaczających liczb.

+0

Pracowałem z sekcji "Frakcja Slash" z [wikipedia] (http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters), który dał mi nadzieję, że będzie działać. – jrturton

+1

Wygląda na to, że co najmniej na pulpicie system renderowania tekstu kakaowego podąża za syntezą informacji zawartych w czcionkach, ale nie syntetyzuje ułamków, jeśli sama czcionka go nie obsługuje. Na przykład, jeśli wpiszesz 1/2 przy pomocy Apple Chancery, wyświetli się ona jako prawdziwa część, ale w Helvetica nie. Nie wiem, czy system renderowania tekstu w Cocoa Touch obsługuje to w ogóle. –

+0

'sub' i' sup' można ustawić dla 'NSAttributedString'. – Sulthan

0

Istnieje kilka znaków Unicode, które dają rzeczywiste ułamki wyglądów, ale są one ograniczone do 1/2, 1/3 i 1/4, jak sądzę.

Jeśli chcesz tego dla dowolnych ułamków, wydaje mi się, że potrzebujesz niestandardowego widoku, który rysuje odpowiedni wygląd; poprzez użycie pozycjonowanych subviews lub drawRect:.

2

Zdarzyło mi się, że chcę tylko prostych frakcji, aby konwertowane były na wulgarne frakcje Unicode.

Oto w jaki sposób można to zrobić:

CGFloat quantityValue = 0.25f; 
NSString *quantity = nil; 
if (quantityValue == 0.25f) { 
    // 1/4 
    const unichar quarter = 0xbc; 
    quantity = [NSString stringWithCharacters:&quarter length:1]; 
} else if (quantityValue == 0.33f) { 
    // 1/3 
    const unichar third = 0x2153; 
    quantity = [NSString stringWithCharacters:&third length:1]; 
} else if (quantityValue == 0.5f) { 
    // 1/2 
    const unichar half = 0xbd; 
    quantity = [NSString stringWithCharacters:&half length:1]; 
} else if (quantityValue == 0.66f) { 
    // 2/3 
    const unichar twoThirds = 0x2154; 
    quantity = [NSString stringWithCharacters:&twoThirds length:1]; 
} else if (quantityValue == 0.75f) { 
    // 3/4 
    const unichar threeQuarters = 0xbe; 
    quantity = [NSString stringWithCharacters:&threeQuarters length:1]; 
} 
NSLog(@"%@", quantity); 
+0

Musisz cierpieć z wieloma "pomyłkami" z powodu błędów zaokrąglania zmiennoprzecinkowych. Musisz wykonać porównanie z wartością * epsilon *. – Droppy

+0

To doskonały punkt. Bardziej szczegółowo demonstrowałem wyświetlanie frakcji Unicode, ale problem z zaokrąglaniem będzie problemem. –

0

wiem, że to było dawno temu, ale czy to pomaga, istnieje Indeks górny znaków Unicode dla wszystkich liczb dziesiętnych można użyć do wyświetlania dowolnych frakcji w większość czcionek; zobacz odpowiedzi na podobne pytanie tutaj - https://stackoverflow.com/a/30860163/4522315

Edit:

Jak na komentarze, to rozwiązanie zależy od czcionki używasz. Amsi Pro (po lewej) i inne komercyjne czcionki zwykle zawierają wszystkie wymagane symbole dla indeksu górnego, ale czcionka systemowa (po prawej) nie.

Nice font System font

+0

To prawda, ale w wielu przypadkach wygląda okropnie, zobacz http://stackoverflow.com/q/7663251 – jrturton

+0

@jrturton Ah. Testowałem tylko przy użyciu czcionki wydawcy. Czcionki systemowe powinny być w porządku, prawda? –

+0

Miałabyś taką nadzieję, ale nie ostatni raz sprawdziłem – jrturton

Powiązane problemy