亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java數(shù)字轉(zhuǎn)中文大寫工具類詳細(xì)代碼(拿去即用)

 更新時間:2024年05月20日 09:44:11   作者:UnIQUE?Eason  
最近項目中用到金額轉(zhuǎn)大寫的地方,索性給大家總結(jié)下,這篇文章主要給大家介紹了關(guān)于Java數(shù)字轉(zhuǎn)中文大寫工具類的相關(guān)資料,文中給出了詳細(xì)的代碼示例,需要的朋友可以參考下

工具類包括:

  • 數(shù)字轉(zhuǎn)中文大寫形式,比如一百二十一
  • 數(shù)字轉(zhuǎn)金額用的大寫形式,比如:壹佰貳拾壹
  • 轉(zhuǎn)金額形式,比如:壹佰貳拾壹整
package cn.hutool.core.convert;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;

/**
 * 數(shù)字轉(zhuǎn)中文類
 **/
public class NumberChineseFormatterUtils {

	/**
	 * 中文形式,奇數(shù)位置是簡體,偶數(shù)位置是記賬繁體,0共用
	 * 使用混合數(shù)組提高效率和數(shù)組復(fù)用
	 **/
	private static final char[] DIGITS = {'零', '一', '壹', '二', '貳', '三', '叁', '四', '肆', '五', '伍',
			'六', '陸', '七', '柒', '八', '捌', '九', '玖'};

	/**
	 * 漢字轉(zhuǎn)阿拉伯?dāng)?shù)字的
	 */
	private static final ChineseUnit[] CHINESE_NAME_VALUE = {
			new ChineseUnit(' ', 1, false),
			new ChineseUnit('十', 10, false),
			new ChineseUnit('拾', 10, false),
			new ChineseUnit('百', 100, false),
			new ChineseUnit('佰', 100, false),
			new ChineseUnit('千', 1000, false),
			new ChineseUnit('仟', 1000, false),
			new ChineseUnit('萬', 1_0000, true),
			new ChineseUnit('億', 1_0000_0000, true),
	};


	/**
	 * 阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,小數(shù)點后四舍五入保留兩位. 使用于整數(shù)、小數(shù)的轉(zhuǎn)換.
	 *
	 * @param amount           數(shù)字
	 * @param isUseTraditional 是否使用繁體
	 * @return 中文
	 */
	public static String format(double amount, boolean isUseTraditional) {
		return format(amount, isUseTraditional, false);
	}

	/**
	 * 阿拉伯?dāng)?shù)字轉(zhuǎn)換成中文,小數(shù)點后四舍五入保留兩位. 使用于整數(shù)、小數(shù)的轉(zhuǎn)換.
	 *
	 * @param amount           數(shù)字
	 * @param isUseTraditional 是否使用繁體
	 * @param isMoneyMode      是否為金額模式
	 * @return 中文
	 */
	public static String format(double amount, boolean isUseTraditional, boolean isMoneyMode) {
		if (amount > 99_9999_9999_9999.99 || amount < -99999999999999.99) {
			throw new IllegalArgumentException("Number support only: (-99999999999999.99 ~ 99999999999999.99)!");
		}

		// 負(fù)數(shù)
		boolean negative = false;
		if (amount < 0) {
			negative = true;
			amount = -amount;
		}

		// 分和角
		long temp = Math.round(amount * 100);

		final int numFen = (int) (temp % 10);
		temp = temp / 10;
		final int numJiao = (int) (temp % 10);
		temp = temp / 10;

		final StringBuilder chineseStr = new StringBuilder(longToChinese(temp, isUseTraditional));
		//負(fù)數(shù)
		if (negative) { // 整數(shù)部分不為 0
			chineseStr.insert(0, "負(fù)");
		}

		// 小數(shù)部分
		if (numFen != 0 || numJiao != 0) {
			if (numFen == 0) {
				chineseStr.append(isMoneyMode ? "元" : "點").append(numberToChinese(numJiao, isUseTraditional)).append(isMoneyMode ? "角" : "");
			} else { // “分”數(shù)不為 0
				if (numJiao == 0) {
					chineseStr.append(isMoneyMode ? "元零" : "點零").append(numberToChinese(numFen, isUseTraditional)).append(isMoneyMode ? "分" : "");
				} else {
					chineseStr.append(isMoneyMode ? "元" : "點").append(numberToChinese(numJiao, isUseTraditional)).append(isMoneyMode ? "角" : "").append(numberToChinese(numFen, isUseTraditional)).append(isMoneyMode ? "分" : "");
				}
			}
		} else if (isMoneyMode) {
			//無小數(shù)部分的金額結(jié)尾
			chineseStr.append("元整");
		}

		return chineseStr.toString();
	}

	/**
	 * 數(shù)字字符轉(zhuǎn)中文,非數(shù)字字符原樣返回
	 *
	 * @param c                數(shù)字字符
	 * @param isUseTraditional 是否繁體
	 * @return 中文字符
	 * @since 5.3.9
	 */
	public static String numberCharToChinese(char c, boolean isUseTraditional) {
		if (c < '0' || c > '9') {
			return String.valueOf(c);
		}
		return String.valueOf(numberToChinese(c - '0', isUseTraditional));
	}

	/**
	 * 阿拉伯?dāng)?shù)字整數(shù)部分轉(zhuǎn)換成中文,只支持正數(shù)
	 *
	 * @param amount           數(shù)字
	 * @param isUseTraditional 是否使用繁體
	 * @return 中文
	 */
	private static String longToChinese(long amount, boolean isUseTraditional) {
		if(0 == amount){
			return "零";
		}

		//將數(shù)字以萬為單位分為多份
		int[] parts = new int[4];
		for (int i = 0; amount != 0; i++) {
			parts[i] = (int) (amount % 10000);
			amount = amount / 10000;
		}

		final StringBuilder chineseStr = new StringBuilder();
		int partValue;
		String partChinese;

		// 千
		partValue = parts[0];
		if(partValue > 0){
			partChinese = thousandToChinese(partValue, isUseTraditional);
			chineseStr.insert(0, partChinese);

			if(partValue < 1000){
				// 和萬位之間空0,則補(bǔ)零,如一萬零三百
				addPreZero(chineseStr);
			}
		}

		// 萬
		partValue = parts[1];
		if(partValue > 0){
			if((partValue % 10 == 0 && parts[0] > 0)){
				// 如果"萬"的個位是0,則補(bǔ)零,如十萬零八千
				addPreZero(chineseStr);
			}
			partChinese = thousandToChinese(partValue, isUseTraditional);
			chineseStr.insert(0, partChinese + "萬");

			if(partValue < 1000){
				// 和億位之間空0,則補(bǔ)零,如一億零三百萬
				addPreZero(chineseStr);
			}
		} else{
			addPreZero(chineseStr);
		}

		// 億
		partValue = parts[2];
		if(partValue > 0){
			if((partValue % 10 == 0 && parts[1] > 0)){
				// 如果"萬"的個位是0,則補(bǔ)零,如十萬零八千
				addPreZero(chineseStr);
			}

			partChinese = thousandToChinese(partValue, isUseTraditional);
			chineseStr.insert(0, partChinese + "億");

			if(partValue < 1000){
				// 和萬億位之間空0,則補(bǔ)零,如一萬億零三百億
				addPreZero(chineseStr);
			}
		} else{
			addPreZero(chineseStr);
		}

		// 萬億
		partValue = parts[3];
		if(partValue > 0){
			if(parts[2] == 0){
				chineseStr.insert(0, "億");
			}
			partChinese = thousandToChinese(partValue, isUseTraditional);
			chineseStr.insert(0, partChinese + "萬");
		}

		if(StrUtil.isNotEmpty(chineseStr) && '零' == chineseStr.charAt(0)){
			return chineseStr.substring(1);
		}

		return chineseStr.toString();
	}

	/**
	 * 把一個 0~9999 之間的整數(shù)轉(zhuǎn)換為漢字的字符串,如果是 0 則返回 ""
	 *
	 * @param amountPart       數(shù)字部分
	 * @param isUseTraditional 是否使用繁體單位
	 * @return 轉(zhuǎn)換后的漢字
	 */
	private static String thousandToChinese(int amountPart, boolean isUseTraditional) {
		int temp = amountPart;

		StringBuilder chineseStr = new StringBuilder();
		boolean lastIsZero = true; // 在從低位往高位循環(huán)時,記錄上一位數(shù)字是不是 0
		for (int i = 0; temp > 0; i++) {
			int digit = temp % 10;
			if (digit == 0) { // 取到的數(shù)字為 0
				if (false == lastIsZero) {
					// 前一個數(shù)字不是 0,則在當(dāng)前漢字串前加“零”字;
					chineseStr.insert(0, "零");
				}
				lastIsZero = true;
			} else { // 取到的數(shù)字不是 0
				chineseStr.insert(0, numberToChinese(digit, isUseTraditional) + getUnitName(i, isUseTraditional));
				lastIsZero = false;
			}
			temp = temp / 10;
		}
		return chineseStr.toString();
	}

	/**
	 * 把中文轉(zhuǎn)換為數(shù)字 如 二百二十 220
	 * 
	 *  一百一十二 -》 112
	 *  一千零一十二 -》 1012
	 *
	 * @param chinese 中文字符
	 * @return 數(shù)字
	 */
	public static int chineseToNumber(String chinese) {
		final int length = chinese.length();
		int result = 0;

		// 節(jié)總和
		int section = 0;
		int number = 0;
		ChineseUnit unit = null;
		char c;
		for (int i = 0; i < length; i++) {
			c = chinese.charAt(i);
			final int num = chineseToNumber(c);
			if (num >= 0) {
				if (num == 0) {
					// 遇到零時節(jié)結(jié)束,權(quán)位失效,比如兩萬二零一十
					if (number > 0 && null != unit) {
						section += number * (unit.value / 10);
					}
					unit = null;
				} else if (number > 0) {
					// 多個數(shù)字同時出現(xiàn),報錯
					throw new IllegalArgumentException(StrUtil.format("Bad number '{}{}' at: {}", chinese.charAt(i - 1), c, i));
				}
				// 普通數(shù)字
				number = num;
			} else {
				unit = chineseToUnit(c);
				if (null == unit) {
					// 出現(xiàn)非法字符
					throw new IllegalArgumentException(StrUtil.format("Unknown unit '{}' at: {}", c, i));
				}

				//單位
				if (unit.secUnit) {
					// 節(jié)單位,按照節(jié)求和
					section = (section + number) * unit.value;
					result += section;
					section = 0;
				} else {
					// 非節(jié)單位,和單位前的單數(shù)字組合為值
					int unitNumber = number;
					if(0 == number && 0 == i){
						// issue#1726,對于單位開頭的數(shù)組,默認(rèn)賦予1
						// 十二 -> 一十二
						// 百二 -> 一百二
						unitNumber = 1;
					}
					section += (unitNumber * unit.value);
				}
				number = 0;
			}
		}

		if (number > 0 && null != unit) {
			number = number * (unit.value / 10);
		}

		return result + section + number;
	}

	/**
	 * 查找對應(yīng)的權(quán)對象
	 *
	 * @param chinese 中文權(quán)位名
	 * @return 權(quán)對象
	 */
	private static ChineseUnit chineseToUnit(char chinese) {
		for (ChineseUnit chineseNameValue : CHINESE_NAME_VALUE) {
			if (chineseNameValue.name == chinese) {
				return chineseNameValue;
			}
		}
		return null;
	}

	/**
	 * 將漢字單個數(shù)字轉(zhuǎn)換為int類型數(shù)字
	 *
	 * @param chinese 漢字?jǐn)?shù)字,支持簡體和繁體
	 * @return 數(shù)字,-1表示未找到
	 */
	private static int chineseToNumber(char chinese) {
		if ('兩' == chinese) {
			// 口語糾正
			chinese = '二';
		}
		final int i = ArrayUtil.indexOf(DIGITS, chinese);
		if (i > 0) {
			return (i + 1) / 2;
		}
		return i;
	}

	/**
	 * 單個數(shù)字轉(zhuǎn)漢字
	 *
	 * @param number           數(shù)字
	 * @param isUseTraditional 是否使用繁體
	 * @return 漢字
	 */
	private static char numberToChinese(int number, boolean isUseTraditional) {
		if (0 == number) {
			return DIGITS[0];
		}
		return DIGITS[number * 2 - (isUseTraditional ? 0 : 1)];
	}

	/**
	 * 獲取對應(yīng)級別的單位
	 *
	 * @param index            級別,0表示各位,1表示十位,2表示百位,以此類推
	 * @param isUseTraditional 是否使用繁體
	 * @return 單位
	 */
	private static String getUnitName(int index, boolean isUseTraditional) {
		if (0 == index) {
			return StrUtil.EMPTY;
		}
		return String.valueOf(CHINESE_NAME_VALUE[index * 2 - (isUseTraditional ? 0 : 1)].name);
	}

	/**
	 * 權(quán)位
	 */
	private static class ChineseUnit {
		/**
		 * 中文權(quán)名稱
		 */
		private final char name;
		/**
		 * 10的倍數(shù)值
		 */
		private final int value;
		/**
		 * 是否為節(jié)權(quán)位,它不是與之相鄰的數(shù)字的倍數(shù),而是整個小節(jié)的倍數(shù)。

		 * 例如二十三萬,萬是節(jié)權(quán)位,與三無關(guān),而和二十三關(guān)聯(lián)
		 */
		private final boolean secUnit;

		/**
		 * 構(gòu)造
		 *
		 * @param name    名稱
		 * @param value   值,即10的倍數(shù)
		 * @param secUnit 是否為節(jié)權(quán)位
		 */
		public ChineseUnit(char name, int value, boolean secUnit) {
			this.name = name;
			this.value = value;
			this.secUnit = secUnit;
		}
	}

	private static void addPreZero(StringBuilder chineseStr){
		if(StrUtil.isEmpty(chineseStr)){
			return;
		}
		final char c = chineseStr.charAt(0);
		if('零' != c){
			chineseStr.insert(0, '零');
		}
	}
}

注意:以上代碼用到hutool工具,需要引入依賴:

		<dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.5</version>
        </dependency>

附:數(shù)字轉(zhuǎn)換

// 數(shù)字轉(zhuǎn)英文
double a = 23.56;
// TWENTY THREE AND CENTS FIFTY SIX ONLY
String a1 = Convert.numberToWord(a);
 
// 數(shù)字轉(zhuǎn)中文
long b = 345673;
// 跟Convert.digitToChinese方法一樣,第二個參數(shù)如果設(shè)為false,就是中文的一二三四...
String s = Convert.numberToChinese(b, true);
 
// 數(shù)字簡化
long b = 345673;
// 34.57w
String s = Convert.numberToSimple(b);
log.info(s);
// 1.2k
String s1 = Convert.numberToSimple(1200);
log.info(s1);
 
// 中文數(shù)字轉(zhuǎn)數(shù)字
// 1012
int b = Convert.chineseToNumber("一千零一十二");
log.info(b + "");

總結(jié) 

到此這篇關(guān)于Java數(shù)字轉(zhuǎn)中文大寫工具類的文章就介紹到這了,更多相關(guān)Java數(shù)字轉(zhuǎn)中文大寫工具類內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea創(chuàng)建properties文件,解決亂碼問題

    idea創(chuàng)建properties文件,解決亂碼問題

    這篇文章主要介紹了idea創(chuàng)建properties文件,解決亂碼問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • SpringMvc之HandlerMapping詳解

    SpringMvc之HandlerMapping詳解

    這篇文章主要介紹了SpringMvc之HandlerMapping詳解,Handler可以理解為具體干活的,也就是我們的業(yè)務(wù)處理邏輯,Handler最終是要通過url 來訪問到,這樣url 與Handler之間就有一個映射關(guān)系了,需要的朋友可以參考下
    2023-08-08
  • log4j2采用AsyncLogger出現(xiàn)的錯誤及解決方案

    log4j2采用AsyncLogger出現(xiàn)的錯誤及解決方案

    這篇文章主要介紹了log4j2采用AsyncLogger出現(xiàn)的錯誤及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • spring mvc常用注解_動力節(jié)點Java學(xué)院整理

    spring mvc常用注解_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了spring mvc常用注解,詳細(xì)的介紹了@RequestMapping, @RequestParam, @ModelAttribute等等這樣類似的注解,有興趣的可以了解一下
    2017-08-08
  • Java中枚舉類型的一種使用方式

    Java中枚舉類型的一種使用方式

    這篇文章主要介紹了Java中枚舉類型的一種使用方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 顯示SonarQube私有項目徽章方案流程

    顯示SonarQube私有項目徽章方案流程

    這篇文章主要為大家介紹了如何顯示SonarQube私有項目徽章方案的流程,sonarQube目前不支持私有項目的徽章圖片獲取,這個問題早在?2018年就在sonar社區(qū)里有過激烈的討論,至今無果,只能自己尋求一種可以快速實施的方案
    2022-02-02
  • MybatisPlusInterceptor實現(xiàn)sql攔截器超詳細(xì)教程

    MybatisPlusInterceptor實現(xiàn)sql攔截器超詳細(xì)教程

    這篇文章主要給大家介紹了關(guān)于MybatisPlusInterceptor實現(xiàn)sql攔截器超詳細(xì)教程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-08-08
  • java list集合排序按某一屬性排序操作

    java list集合排序按某一屬性排序操作

    這篇文章主要介紹了java list集合排序按某一屬性排序操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Java集合的定義與Collection類使用詳解

    Java集合的定義與Collection類使用詳解

    這篇文章主要介紹了Java集合的定義及Collection工具類使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11
  • 關(guān)于SpringBoot中controller參數(shù)校驗的使用

    關(guān)于SpringBoot中controller參數(shù)校驗的使用

    本文主要介紹了關(guān)于SpringBoot中controller參數(shù)校驗的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01

最新評論