ZetCode

Java DecimalStyle 类

最后修改时间:2025 年 4 月 16 日

java.time.format.DecimalStyle 类提供了用于格式化和解析数字的符号和样式。它定义了数字的数字字符、符号以及数字表示中使用的其他符号。DecimalStyle 是不可变的且线程安全的。

DecimalStyle 被数字格式化器(如 DecimalFormat)和日期时间格式化器使用。它支持特定于语言环境的符号,同时保持一致性。该类处理数字、小数点分隔符和其他格式化元素。

DecimalStyle 类概述

DecimalStyle 提供了获取和自定义数字符号的方法。关键操作包括获取默认样式、修改符号以及检查有效性。该类适用于标准和本地化数字格式。

public final class DecimalStyle {
    public static final DecimalStyle STANDARD;
    public static DecimalStyle ofDefaultLocale();
    public static DecimalStyle of(Locale locale);
    public char getZeroDigit();
    public char getDecimalSeparator();
    public char getNegativeSign();
    public char getPositiveSign();
    public DecimalStyle withZeroDigit(char zeroDigit);
    public DecimalStyle withDecimalSeparator(char decimalSeparator);
}

上面的代码展示了 DecimalStyle 提供的一些关键方法。这些方法允许访问和修改数字格式化符号。该类提供了标准和特定于语言环境的实现。

获取默认 DecimalStyle

可以采用多种方式获取 DecimalStyle 对象。标准实例使用 ASCII 数字字符和符号。特定于语言环境的实例会适应区域约定。

Main.java
package com.zetcode; 

import java.time.format.DecimalStyle;
import java.util.Locale;

public class Main {

    public static void main(String[] args) {
        
        // Standard style (ASCII digits)
        DecimalStyle standard = DecimalStyle.STANDARD;
        System.out.println("Standard zero digit: " + standard.getZeroDigit());
        
        // Default locale style
        DecimalStyle defaultLocale = DecimalStyle.ofDefaultLocale();
        System.out.println("Default locale decimal separator: " + 
            defaultLocale.getDecimalSeparator());
        
        // Specific locale style
        DecimalStyle french = DecimalStyle.of(Locale.FRENCH);
        System.out.println("French decimal separator: " + 
            french.getDecimalSeparator());
    }
}

此示例演示了获取 DecimalStyle 实例的不同方法。输出显示了符号在标准样式和特定于语言环境的样式之间的差异。法语语言环境通常使用逗号作为小数点分隔符。

访问 DecimalStyle 符号

可以查询 DecimalStyle 以获取其格式化符号。这些符号包括数字字符、符号和分隔符。这些符号定义了数字的格式化和解析方式。

Main.java
package com.zetcode; 

import java.time.format.DecimalStyle;

public class Main {

    public static void main(String[] args) {

        DecimalStyle style = DecimalStyle.ofDefaultLocale();
        
        // Get zero digit character
        char zero = style.getZeroDigit();
        System.out.println("Zero digit: " + zero);
        
        // Get decimal separator
        char separator = style.getDecimalSeparator();
        System.out.println("Decimal separator: " + separator);
        
        // Get negative sign
        char negative = style.getNegativeSign();
        System.out.println("Negative sign: " + negative);
        
        // Get positive sign
        char positive = style.getPositiveSign();
        System.out.println("Positive sign: " + positive);
    }
}

此示例展示了如何从 DecimalStyle 访问各种符号。这些符号依赖于语言环境,并影响数字格式化。大多数语言环境使用 '-' 表示负号,'+' 表示正号。

创建自定义 DecimalStyle

DecimalStyle 支持创建具有自定义符号的修改实例。with 方法返回具有更改符号的新实例。原始实例保持不变。

Main.java
package com.zetcode; 

import java.time.format.DecimalStyle;

public class Main {

    public static void main(String[] args) {

        DecimalStyle standard = DecimalStyle.STANDARD;
        
        // Create style with custom zero digit
        DecimalStyle customZero = standard.withZeroDigit('〇');
        System.out.println("Custom zero: " + customZero.getZeroDigit());
        
        // Create style with custom separator
        DecimalStyle customSep = standard.withDecimalSeparator('|');
        System.out.println("Custom separator: " + customSep.getDecimalSeparator());
        
        // Chain modifications
        DecimalStyle fullCustom = standard.withZeroDigit('A')
                                        .withDecimalSeparator('@')
                                        .withNegativeSign('~');
        System.out.println("Fully custom style: " + 
            fullCustom.getZeroDigit() + " " + 
            fullCustom.getDecimalSeparator() + " " + 
            fullCustom.getNegativeSign());
    }
}

此示例演示了创建自定义 DecimalStyle 实例。每个 with 方法都返回一个新实例。由于不可变性,原始的 STANDARD 实例保持不变。

将 DecimalStyle 与 NumberFormat 一起使用

DecimalStyle 可以与数字格式化器一起使用以自定义格式化。虽然通常在内部使用,但我们可以使格式化器适应使用自定义样式。

Main.java
package com.zetcode; 

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.time.format.DecimalStyle;
import java.util.Locale;

public class Main {

    public static void main(String[] args) {

        DecimalStyle style = DecimalStyle.of(Locale.GERMAN);
        
        // Create DecimalFormatSymbols from DecimalStyle
        DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.GERMAN);
        symbols.setZeroDigit(style.getZeroDigit());
        symbols.setDecimalSeparator(style.getDecimalSeparator());
        symbols.setMinusSign(style.getNegativeSign());
        
        // Create formatter with custom symbols
        DecimalFormat format = new DecimalFormat("#,##0.00", symbols);
        String formatted = format.format(-1234.56);
        System.out.println("Formatted number: " + formatted);
    }
}

此示例展示了如何使 DecimalFormat 适应使用来自 DecimalStyle 的符号。德语语言环境通常使用逗号作为小数点分隔符。格式化输出反映了语言环境的约定。

DecimalStyle 在 DateTimeFormat 中

DecimalStyle 在内部被日期时间格式化器用于数字处理。我们可以检查它如何影响日期和时间格式化模式。

Main.java
package com.zetcode; 

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DecimalStyle;
import java.util.Locale;

public class Main {

    public static void main(String[] args) {

        LocalTime time = LocalTime.of(9, 5, 30);
        
        // Standard formatting
        DateTimeFormatter standardFmt = DateTimeFormatter.ofPattern("hh:mm:ss");
        System.out.println("Standard format: " + standardFmt.format(time));
        
        // With Arabic digits
        DecimalStyle arabicStyle = DecimalStyle.STANDARD.withZeroDigit('٠');
        DateTimeFormatter arabicFmt = standardFmt.withDecimalStyle(arabicStyle);
        System.out.println("Arabic digits: " + arabicFmt.format(time));
    }
}

此示例演示了 DecimalStyle 对日期时间格式化的影响。第二个格式化器使用东阿拉伯数字。相同的时间以不同的数字字符显示。

验证 DecimalStyle 符号

在创建自定义 DecimalStyle 实例时,符号验证非常重要。无效的符号会导致格式化和解析问题。

Main.java
package com.zetcode; 

import java.time.format.DecimalStyle;

public class Main {

    public static void main(String[] args) {

        try {
            // Valid zero digit
            DecimalStyle valid = DecimalStyle.STANDARD.withZeroDigit('A');
            System.out.println("Valid zero digit: " + valid.getZeroDigit());
            
            // Invalid zero digit (non-digit character)
            DecimalStyle invalid = DecimalStyle.STANDARD.withZeroDigit('!');
            System.out.println("This won't be printed");
        } catch (IllegalArgumentException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }
}

此示例展示了 DecimalStyle 中的符号验证。虽然 API 并非在所有情况下都明确验证,但使用不合适的符号可能会导致问题。零数字字符应该是一个有效的数字字符。

来源

Java DecimalStyle 类文档

在本文中,我们介绍了 Java DecimalStyle 类的基本方法和特性。理解这些概念对于在 Java 应用程序中进行数字格式化至关重要。

作者

我叫 Jan Bodnar,是一名经验丰富的程序员,在该领域拥有多年经验。我从 2007 年开始撰写编程文章,至今已撰写了 1,400 多篇文章和八本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程