java - 本地化数字和日期格式,但不本地化数字符号

标签 java locale number-formatting date-format

我有一个用例,我想根据用户区域设置显示日期和数字。

我分别使用 DateFormat.getDateInstance(DateFormat.MEDIUM, locale) 和 NumberFormat.getNumberInstance(locale) 。

我面临的问题是,DateFormat 和 NumberFormat 也会根据区域设置更改数字,这不是我想要的。希望最终字符串仅使用阿拉伯数字 (0-9)。

例如,

对于一个值,53.54 在 hi_IN 中,它变成 ५३.५४

在 de_DE 中,它变为 53,54

而我希望它是这样的,

在 hi_IN,53.54

在 de_DE,53,54

是否使用.或 ,因为小数分隔符应基于区域设置,但数字应为阿拉伯语。 在日期转换中面临类似的问题。

感谢任何帮助!

最佳答案

虽然我无法重现您所描述的行为,但我可以向您展示如何控制格式化程序使用的数字。

    NumberFormat nf = NumberFormat.getNumberInstance();
    if (nf instanceof DecimalFormat) {
        DecimalFormat df = (DecimalFormat) nf;

        // Hindi digits
        char ch0 = '\u0966'; // Hindi zero
        DecimalFormatSymbols symbols = df.getDecimalFormatSymbols();
        symbols.setZeroDigit(ch0);
        df.setDecimalFormatSymbols(symbols);
        System.out.println(nf.format(53.54));

        // Western digits
        symbols.setZeroDigit('0'); // Western zero
        df.setDecimalFormatSymbols(symbols);
        System.out.println(nf.format(53.54));
    } else {
        System.out.println("Cannot control digits for this formatter");
    }

在我的计算机上,此代码段的输出是:

५३.५४
53.54

我们只指定零位数字,即用于 0 的字符。格式化程序从中计算出其他数字本身。

对于格式化日期,我强烈推荐 java.time、现代 Java 日期和时间 API 及其 DateTimeFormatter

    DateTimeFormatter dateFormatter = DateTimeFormatter
            .ofLocalizedDate(FormatStyle.SHORT).withLocale(Locale.GERMAN);

    // Hindi digits
    DecimalStyle style = dateFormatter.getDecimalStyle().withZeroDigit(ch0);
    DateTimeFormatter hindiDateFormatter = dateFormatter.withDecimalStyle(style);
    System.out.println(LocalDate.now(ZoneId.of("Europe/Vienna")).format(hindiDateFormatter));

    // Western digits
    style = dateFormatter.getDecimalStyle().withZeroDigit('0');
    DateTimeFormatter westernDateFormatter = dateFormatter.withDecimalStyle(style);
    System.out.println(LocalDate.now(ZoneId.of("Europe/Zurich")).format(westernDateFormatter));
१२.१२.१९
12.12.19

您尝试在问题中使用的 DateFormat 类非常麻烦且早已过时。

链接: Oracle tutorial: Date Time解释如何使用 java.time。

关于java - 本地化数字和日期格式,但不本地化数字符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59273380/

相关文章:

PHP 在数字中添加千位分隔符并保留前导零

java - 作为调用父框架的对话框启动应用程序

python - 在 Python 中使用带有 LOCALE 和 UNICODE 标志的 Regex 测试空格

java - 检索异常完整堆栈跟踪

objective-c - 如何检测未知编码的字符(如 Textmate)?

java - SetLocale 的 NoSuchMethodError 异常

ios - NSNumberFormatter 检查特定的小数

ios - xcode 11 中的 NumberFormatter

java - Gradle 锁定异常 : Gradle in use by another Gradle instance

java - 如何为java设置永久内存设置?