如何解析小数分隔符为冒号的数字的字符串表示形式:

时间:2017-03-14 14:28:38

标签: c++ icu

我在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?

1 个答案:

答案 0 :(得分:1)

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

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

格式字符串不是特定于语言环境的,因此您将继续使用模式###,###.##