NSDecimalNumber DecimalNumberWithString:忽略当前区域设置

2024-02-06

根据文档,[NSDecimalNumber decimalNumberWithString:]应该使用区域小数分隔符:

NSDecimalSeparator 是否是句点(例如所使用的, 在美国)或逗号(例如在法国使用的) 取决于默认区域设置。

但是当我尝试时,这段代码:

NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]);
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]);

Gives...

100
100.1

...作为 iOS 5 和 iOS 6 上的输出。我尝试使用瑞典语和法语作为区域设置,因为这两个国家/地区都使用逗号 (,) 作为小数分隔符。

输出不应该是一样的吗?

(我知道我可以使用 [NSDecimalNumber DecimalNumberWithString:locale:] 来强制行为,所以这个问题不是寻找替代方案,只是如果这是一个错误或者我做错了什么)


NSDecimalNumber 只是数字类型数据的存储类。它正在对您传递给它的字符串运行解析器(NSNumberFormatter)以创建其编号。第二个日志语句工作“更好”的原因是因为第一个日志语句使用默认数字格式区域设置(它好像它是 en_US,但我无法验证这一点,请参阅编辑下方以获取更多信息.) 进行解析,“100,1”不是一个有效的数字,因此“非数字”部分被剥离。通过指定使用“,”小数分隔符的区域设置,它可以正确捕获完整的数字。

当你 NSLog() 一个 NSDecimalNumber 它只是调用-description,它没有区域设置上下文,并且可以或多或少地打印它想要的任何内容。

如果你想打印格式正确的数字,请使用 NSNumberFormatter,如下所示:

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];

NSLog(@"%@", number);

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

[formatter setNumberStyle:NSNumberFormatterDecimalStyle];

NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];

[formatter setLocale:locale];

NSLog(@"%@", [formatter stringFromNumber:number]);

或者,简单地说

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];
NSLog(@"%@", [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterDecimalStyle]);

如果您只想使用当前区域设置。

总之:

  1. NSDecimalNumber 只是存储。记录它并不反映任何有关区域设置的信息。
  2. 为了让 NSDecimalNumber 正确存储数字,其区域设置需要与预期输入的区域设置相匹配(-[NSLocale currentLocale]这里是一个不错的选择)。
  3. 为了显示给定区域设置正确格式化的数字,请使用 NSNumberFormatter。

Edit:

好的,我对此做了更多研究。

在 GNUStep 中,看起来它最终使用了值NSDecimalSeparator in NSUserDefaults(快速浏览他们的代码)。

经过一些实验,据我所知,以下任何一个都不会影响默认的解析行为:

  1. NSDecimalSeparator in NSUserDefaults.
  2. AppleLocale in NSUserDefaults.
  3. NSLocaleCode in NSUserDefaults.
  4. 设定的值是CFBundleDevelopmentRegion.
  5. 环境的LANG/LC_ALL/等等...值。
  6. +[NSLocale systemLocale].

显然不是+[NSLocale currentLocale],因为这个问题源于当前区域设置没有效果的事实。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NSDecimalNumber DecimalNumberWithString:忽略当前区域设置 的相关文章

随机推荐

  • 如何为单个 If 语句执行多个条件

    我试图在 vbscript 中的单个 If 语句上执行两个条件 应该很简单 但它不起作用 就像是 If Not fileName testFileName fileName lt gt Then Else 我用两个 if 语句来让它工作 但
  • 使CPU的缓存失效

    当我的程序执行具有获取语义的加载操作 具有释放语义的存储操作或可能是完整栅栏时 它会使 CPU 的缓存无效 我的问题是 缓存的哪一部分实际上失效了 只有保存我使用的获取 释放变量的缓存行 或者整个缓存都失效了 L1 L2 L3 等等 当我使
  • 将 Office365 REST 日历 ID 映射到 EWS 日历项目 ID

    使用交换推送通知 https msdn microsoft com en us library aa566188 v exchg 80 aspx我一直在创建一项同步 Office365 用户的日历数据的服务 我一直在使用以下组合Office
  • 如何在 MYSQL 中获取主管姓名而不是 UserID + INNER JOIN

    这是我的表格 从用户中选择 USERID NAME STATUS 1 AAA Member 2 BBB Member 3 CCC Supervisor 4 DDD Member 5 EEE Member 从出席中选择 NO DATE SUP
  • 在自定义行为上绑定依赖属性时出错

    我正在探索 Silverlight 附加行为机制 以便在我的 Silverlight 应用程序中使用模型 视图 视图模型模式 首先 我试图让一个简单的 Hello World 工作 但我完全陷入了一个错误 无法找到解决方案 我现在拥有的是一
  • 如何计算图像是横向还是纵向

    我正在使用 jquery 创建一个图片库 有没有可能使用jquery计算图像是横向还是纵向 感谢您的支持 您可以简单地比较图像的宽度和高度 var someImg someId if someImg width gt someImg hei
  • 将类的序列化放入DLL中

    我正在寻找一个 工作 示例 用于在 DLL 中外部序列化类结构 目前我找不到任何例子 Boost 文档只是说明一些宏 论坛和新闻组只是讨论具体问题及其解决方案 所以我要求提供一个 外部 序列化类结构的示例 如下所示 除了类代码之外 我还添加
  • OSX 安装 Rsymphony - 链接标头和库

    symphony 已在终端中正确安装和测试 当尝试从源代码安装 Rsymphony 时 R 抱怨缺少标头和库 非常感谢任何指点 谢谢你 symphony安装目录 Users timo Applications symphony R安装命令
  • 使用 php str_getcsv 函数将 csv 文件数据转换为数组

    我有类似使用创建的字符串fputcsv http php net manual en function fputcsv php Date Name Hours 2013 01 02 Test User 7 59 2013 01 03 Tes
  • 将条件的“Future”更改为静态类型“bool”

    这个问题真的非常相似this one https stackoverflow com questions 54691370 flutter returning a bool type from a futurebool method 我已遵
  • 如何在 Zend Framework 2 中创建通用模块/控制器/操作路由?

    我想在 Zend Framework 2 中创建一个通用模块 控制器 操作路由 以便与 ZF2 MVC 架构一起使用 在 ZF1 中 默认路由的定义如下 module controller action 其中模块默认为default 控制器
  • 为什么我的数组中的指针指向同一个字符串?

    我试图理解为什么会出现问题 我有一个文件 我从中读取了几行 char array slave 128 int i 0 while read getline line len fp 1 if strstr line X NULL array
  • PostgreSQL 自动增量在每次更新时增加

    每次我执行 INSERT 或 UPSERT 发生冲突更新时 时 每个表上的增量列都会按之前的更新数量递增 例如 如果我有这张表 id int4 title text description text updated at timestamp
  • iPhone 上的 adhoc 应用程序安装失败,为什么?

    我正在开发一个 iPhone 应用程序 由于应用程序具有位置感知功能 因此我正在不同的地方 我不在场的地方 对其进行测试 为此 我向我的朋友发送了 mobileprovision 配置文件和应用程序临时构建 但最后应用程序安装停止在中间 在
  • TypeScript 依赖的字符串文字属性和索引

    如同Typescript 属性的类型依赖于同一对象中的另一个属性 https stackoverflow com questions 56949513 typescript type of a property dependent on a
  • 无法找到类“com.sun.facelets.FaceletViewHandler”

    我有 Richfaces 应用程序 我将其部署到 Glassfish v3 许多周 几乎 一切正常 但今天突然出现以下错误 我的 pom xml 中有 jsf facelets 1 1 14 jar 依赖项 我不知道如何解决这个问题 帮助
  • 如何运行Titanium生成的Xcode项目?

    我确信以前可以做到这一点 但我似乎无法在 Xcode 中运行 Titanium 生成的 Xcode 项目 该应用程序安装在模拟器中并启动 但立即停止 并出现以下运行时错误 Could not find the file app js 我正在
  • 清除帐户删除数据

    我想当用户手动从应用程序中删除帐户时清除应用程序的数据Accounts sync设置应用程序中的部分 我有自己的实现AbstractAccountAuthenticator但没有方法可以挂钩删除帐户过程 有什么提示吗 我一直在思考同样的问题
  • Magento 更改 div 的下拉可配置产品选项

    我需要将可配置产品的选项显示为内部带有 a 的 div 让用户在选项中单击并选择它 而不是下拉列表 就像菜单 目标是显示鞋子尺码 正如许多人所知 Magento 使用 Json 响应来填充下拉菜单的选项 var spConfig new P
  • NSDecimalNumber DecimalNumberWithString:忽略当前区域设置

    根据文档 NSDecimalNumber decimalNumberWithString 应该使用区域小数分隔符 NSDecimalSeparator 是否是句点 例如所使用的 在美国 或逗号 例如在法国使用的 取决于默认区域设置 但是当我