使用Unicode表示分数的NSString

6

我正在尝试在我的iPhone应用程序中“美观”地显示分数。以前,我一直在使用繁琐的switch语句来硬编码vulgar fractions 的unicode字符,但我已经了解到Unicode分数斜杠字符,如果我理解正确,应该意味着我可以创建如下字符串:

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

“渲染器”会自动以较小的上标和下标形式打印它。然而,以上代码只给出了标准的1/2外观。我正在使用drawAtPoint将字符串放在屏幕上。我已经尝试过使用decomposedStringUsingCanonicalMapping和precomposedStringUsingCanonicalMapping进行实验,但老实说,文档让我迷失了方向。

这应该可以工作吗?还是NSString绘制无法处理这个问题?

4个回答

2

我只需要将食谱中的简单分数转换为Unicode下的普通分数。

以下是实现方法:

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);

由于浮点数舍入误差,您必须忍受许多“失误”。 您需要使用epsilon值执行比较。 - Droppy
这是一个非常好的观点。更具体地说,我正在演示Unicode分数的显示,但舍入误差将是一个问题。 - Cameron Lowell Palmer

1

我不知道任何一种Unicode字符可以具有您描述的属性。据我所知,唯一区分U+2044和普通斜杠的是它更倾斜,并且两侧几乎没有空间,因此使其与周围的数字更加紧密。

这里有一个页面介绍如何在HTML中使用分数斜杠,正如您所看到的,它演示了如果您尝试自己使用它,只会得到类似于“1⁄10”的东西。它通过在HTML中使用<sup><sub>标签来处理周围数字以获得适当的显示效果。

为了使NSString能够正常工作,您需要自己找出一些方法将上下标应用于周围的数字。


我正在从wikipedia的“分数斜杠”部分工作,这让我有希望它会起作用。 - jrturton
1
在桌面上看起来,Cocoa文本渲染系统遵循字体提供的分数合成信息,但如果字体本身不支持,则不会合成分数。例如,如果您使用Apple Chancery键入1/2,则显示为真正的分数,但在Helvetica中则不会。我不知道Cocoa Touch中的文本渲染系统是否支持此功能。 - Lily Ballard
NSAttributedString 可以设置 subsup - Sulthan

0

我知道这是很久以前的事情了,但如果有帮助的话,对于所有十进制数字,都有上标Unicode字符可用于在大多数字体中显示任意分数;请参见类似问题的答案 - https://stackoverflow.com/a/30860163/4522315

编辑:

根据评论,此解决方案取决于您使用的字体。Amsi Pro(左)和其他商业字体倾向于包含所有所需的上标符号,但系统字体(右)则不包括。

Nice font System font


没错,但在许多情况下看起来很糟糕,请参见https://dev59.com/iVvUa4cB1Zd3GeqPyfAh。 - jrturton
@jrturton 噢,我只是在测试使用发布者字体。系统字体应该没问题,对吗? - Corwin Newall
希望是这样,但上次我检查时不是这样。 - jrturton
你说得对。我刚刚检查了一下。只要涉及到上标1、2、3,iOS系统字体就会变得很丑。 - Corwin Newall

0

有一些包含的Unicode字符可以给出实际的分数外观,但它们仅限于1/2、1/3和1/4。

如果您想要任意分数的话,我认为您需要一个自定义视图来绘制适当的外观;可以通过使用定位子视图或drawRect:来实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接