0

"#.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で整数として解釈されることなく、どのように二重数を解析/フォーマットできますか?

4

1 に答える 1

2

呼び出すことができますformattable.getDouble(status)-getTypeがlongを返す唯一の理由は、特定の値がlongに収まるためです。

フォーマットに関しては、フォーマットの前に呼び出すf->setMinimumFractionDigits(1);と、コードで「2.0」が表示され、最小桁数を2に設定すると「2.00」などになります。

hth

于 2010-10-15T05:40:14.547 に答える