【问题标题】:How to parse string representation of number where decimal separator is colon :如何解析小数点分隔符为冒号的数字的字符串表示:
【发布时间】:2017-03-14 14:28:37
【问题描述】:

我在 C++ 程序中使用 ICU 来解析文本中的十进制值,这些文本可能包含各种语言环境和特定于应用程序的十进制值表示。代码的第一层应用正则表达式放大文本中的相关部分,然后我需要对(在这种情况下)包含十进制值的字符串进行格式化。

在配置中,我们可以设置语言环境(例如“en”、“sv”)和应该应用的 ICU 十进制格式。例如,“en”和格式###,###.## 将使用以下代码解析美国英语样式编号“123,456.70”(省略错误处理):

UErrorCode error = U_ZERO_ERROR;
icu::Formattable binvalue( 0.0 );
icu::Locale iculocale( locale_as_string ); // e.g "sv", "en"
icu::DecimalFormatSymbols symbols( iculocale, error );
icu::DecimalFormat format( pattern, symbols, error ); // pattern as "###,###.##"
format.parse( value, binvalue, error );

现在我需要解析显然具有自定义格式的输入字符串 123:70。我无法控制生成文件的应用程序。输入文档的语言环境是“sv”(瑞典语),但这可能并不重要。

是否可以通过指定区域设置和 ICU 数字模式来完成这项工作,例如 ###,###':'## (这显然不是正确的示例)。从我的应用程序的 UI 中,我(现在)只能设置模式和语言环境。所以我没有办法自定义 DecimalFormatSymbols。

不幸的是,除了DecimalFormat 之外,我对阅读 ICU 十进制格式没有什么兴趣

简而言之,我可以通过模式字符串覆盖小数点分隔符吗?是否有模式和语言环境组合可以解析“123:70”并返回十进制值 123.7?

【问题讨论】:

  • ### 表示数字的长度?
  • 我在编程中所做的只是移动/重新格式化数据......那么为什么不先用字符串替换“:”呢?
  • 当然。但是,我正在创建一个解决方案,其中可以由半技术用户设置匹配和反格式规则,而无需编写脚本。如果他们知道正则表达式并且可以指定值的格式,那么他们很高兴。我不想为此扩展规则集编辑器的格式(和用户界面)。无论如何可能需要这样做

标签: c++ icu


【解决方案1】:

您的符号对象有一个方法setSymbol,您可能想调用它。

symbols.setSymbol(icu::DecimalFormatSymbols::kDecimalSeparatorSymbol, ':');

格式字符串不是特定于区域设置的,因此您将继续使用模式###,###.##

【讨论】:

  • 这当然可以。我只是在寻找一种方法来避免在应用程序的 UI 和配置格式中添加额外的参数(自定义小数分隔符),希望我可以通过模式 - 已经在 UI 中。但是,正如您所指出的,格式与区域设置无关。所以我需要添加配置“符号”的方法。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 2019-12-30
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-23
相关资源
最近更新 更多