Java NumberFormat 数字格式工具类

一. 概述

在日常开发中, 有些场景我们需要对数字格式进行处理, 例如小数位数, 价格, 百分数等, 下面介绍一下java自带的工具类NumberFormat

二. 示例说明

2.1 数字按不同国家设置显示格式

import java.text.NumberFormat;
import java.util.Locale;
public class FormattingNumbers {
    public static void main(String[] args) {
        double n = 1240.35;
        // 获取美国的数字格式
        NumberFormat nf = NumberFormat.getInstance(new Locale("en", "US"));
        String val = nf.format(n);
        System.out.println(val);
        // 获取斯洛伐克的数字格式
        NumberFormat nf2 = NumberFormat.getInstance(new Locale("sk", "SK"));
        String val2 = nf2.format(n);
        System.out.println(val2);        
        // 获取丹麦的数字格式
        NumberFormat nf3 = NumberFormat.getInstance(new Locale("da", "DK"));
        String val3 = nf3.format(n);
        System.out.println(val3);
    }
}

输出结果

1,240.35
1 240,35
1.240,35

2.2 控制小数位数

import java.text.NumberFormat;
import java.util.Locale;
public class FractionDigits {
    public static void main(String[] args) {
        double val1 = 4.5678934;
        double val2 = 2.3;
        NumberFormat nf1 = NumberFormat.getInstance(new Locale("zh", "CN"));
        NumberFormat nf2 = NumberFormat.getInstance(new Locale("zh", "CN"));
        // 设置小数最少位数, 不够补零
        nf1.setMinimumFractionDigits(2);
        // 设置小数最大位数, 位数超出根据策略进行取舍, 默认四舍五入
        nf1.setMaximumFractionDigits(4);
        nf2.setMaximumFractionDigits(4);
        // 采取四舍五入策略
        nf1.setRoundingMode(RoundingMode.UP);
        // 不采取四舍五入策略
        nf2.setRoundingMode(RoundingMode.DOWN);
        System.out.println(nf1.format(val1));
        System.out.println(nf1.format(val2));
        System.out.println(nf2.format(val1));
    }
}

输出结果

4.5679
2.30
4.5678

附BigDecimal 小数位控制

/**
     * 四舍五入保留多少位小数
     * @param newScale 保留多少位小数
     */
    public static double formatDoubleByScale(double num, int newScale) {
        BigDecimal bg = doubleToBigDecimal(num).setScale(newScale, RoundingMode.UP);
        return bg.doubleValue();
    }

    /**
     * 不四舍五入保留多少位小数
     * @param newScale 保留多少位小数
     */
    public static double formatDoubleByScaleN(double num, int newScale) {
        BigDecimal bg = doubleToBigDecimal(num).setScale(newScale, RoundingMode.DOWN);
        return bg.doubleValue();
    }

2.3 格式化百分比

import java.text.NumberFormat;
import java.util.Locale;
public class Percentages {
    public static void main(String[] args) {
        double num1 = 0.234;
        String num2 = "35.5%";
        // 获取百分数处理对象
        NumberFormat pf = NumberFormat.getPercentInstance(Locale.CHINA);
        // 数字转百分数
        String format = pf.format(num1);
        // 百分数转数字
        Double parse = (Double) pf.parse(num2);
        System.out.println(format);
        System.out.println(parse);
    }
}

输出结果

23%
0.355

2.4 格式货币

import java.text.NumberFormat;
import java.util.Locale;
public class Currencies {
    public static void main(String[] args) {
        int val = 23500;
        // 获取美国货币格式
        NumberFormat cf1 = NumberFormat.getCurrencyInstance(new Locale("en", "US"));
        System.out.println(cf1.format(val));
        // 获取斯洛伐克货币格式
        NumberFormat cf2 = NumberFormat.getCurrencyInstance(new Locale("sk", "SK"));
        System.out.println(cf2.format(val));
        // 获取中国货币格式
        NumberFormat cf3 = NumberFormat.getCurrencyInstance(new Locale("zh", "CN"));
        System.out.println(cf3.format(val));      
    }
}

输出结果

$23,500.00
23 500,00 €
¥23,500.00

2.5 解析数字

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
public class ParsingNumbers {
    public static void main(String[] args) throws ParseException {
        NumberFormat nf = NumberFormat.getInstance(new Locale("sk", "SK"));
        Number num = nf.parse("150000,45646");
        System.out.println(num.doubleValue());
    }
}

输出结果

150000.45646
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容