"#.0"
NumberFormat / DecimalFormatは、形式(#は任意の数値)の文字列をdoubleとして解析しないようです。次のコードはこれを示しています。
#include <cstdio>
#include <iostream>
#include <unicode/decimfmt.h>
#include <unicode/numfmt.h>
#include <unicode/unistr.h>
#include <unicode/ustream.h>
int main() {
UErrorCode status = U_ZERO_ERROR;
// DecimalFormat doesn't work either
NumberFormat* f = NumberFormat::createInstance(status);
f->setGroupingUsed(false);
f->setParseIntegerOnly(false);
UnicodeString str("2.0"); // Change to "2.#" for it to work, where # is any non-zero number
Formattable formattable;
f->parse(str, formattable, status);
if (U_FAILURE(status)) {
printf("ERROR: %s\n", u_errorName(status));
delete f;
return 1;
} else {
if (formattable.getType() == Formattable::kDouble) {
printf("kDouble: %f\n", formattable.getDouble());
} else if ((formattable.getType() == Formattable::kLong)) {
printf("kLong: %d\n", formattable.getLong());
} else {
printf("ERROR: unexpected type: %d\n", formattable.getType());
}
}
str.remove(); // Clear the string
f->format(2.0f, str);
std::cout << "formatted: \"" << str << '\"' << std::endl; // Outputs "2"
delete f;
return 0;
}
解析する場合"2.0"
、Formattableのタイプは2(Formattable::Type::kLong
)です。"2.1"
Formattableの型を解析する場合、1()Formattable:Type::kDouble
-両方の文字列の場合と同じです。
floatをUnicodeStringとしてフォーマットしようとした場合にも問題が発生します(たとえば、float2.0
がにフォーマットされ"2"
ます)。
だから:ICUで整数として解釈されることなく、どのように二重数を解析/フォーマットできますか?