package com.wikiway.nebula.common.format;

import java.util.Scanner;

/**
 * 数字金额(元、分)转为英文
 * 
 * @see http://www.statman.info/conversions/number_scales.html
 * @author zzf 增强:1)增加小数金额 2)正确支持million、billion(原版不正确),金额限制<20亿(2 billion)。
 */
public class NumToWords {
	String string;
	String st1[] = { "", "one", "two", "three", "four", "five", "six", "seven",
			"eight", "nine", };
	String st2[] = { "hundred", "thousand", "million", "billion" };
	String st3[] = { "ten", "eleven", "twelve", "thirteen", "fourteen",
			"fifteen", "sixteen", "seventeen", "eighteen", "nineteen", };
	String st4[] = { "twenty", "thirty", "forty", "fifty", "sixty", "seventy",
			"eighty", "ninety" };

	public String convert(double number) {
		return convert(number, "dollars", "cents");
	}

	public String convert(double number, String dollarsUnit, String centsUnit) {
		int b1 = (int) number;
		String s1 = convert(b1, dollarsUnit);
		double b2 = number - b1;
		if (b2 != 0) {
			// 金额取两位小数
			int cents = (int) Math.round(b2 * 100);
			// String s2=convert(cents,"cents");
			// s1+=" and "+s2;
			s1 += " and " + cents + " " + cents;
		} else {
			s1 += " only";
		}
		return s1;
	}

	private String convert(int number, String unit) {
		int n = 1;
		string = "";
		while (number != 0) {
			number = convertSeg(number, n);
			n++;
		}
		string = string.trim().replaceAll("  ", " ");
		if (unit == null || unit.length() == 0) {
			return string;
		}
		return string + " " + unit;
	}

	private int convertSeg(int number, int n) {
		int word;
		switch (n) {
		case 1:
			word = number % 100;
			pass(word);
			if (number > 100 && number % 100 != 0) {
				show("and ");
			}
			number /= 100;
			break;

		case 2:
			word = number % 10;
			if (word != 0) {
				show(" ");
				show(st2[0]);
				show(" ");
				pass(word);
			}
			number /= 10;
			break;
		case 3:
			word = number % 1000;
			if (number < 1000) {
				show(" ");
				show(st2[1]);
				show(" ");
				int n1 = 1;
				while (number != 0) {
					number = convertSeg(number, n1);
					n1++;
				}
			} else if (word != 0) {
				show(" ");
				show(st2[1]);
				show(" ");
				pass(word);
			}
			number /= 1000;
			break;

		case 4:
			word = number % 1000;
			if (number < 1000) {
				show(" ");
				show(st2[2]);
				show(" ");
				int n2 = 1;
				while (number != 0) {
					number = convertSeg(number, n2);
					n2++;
				}
			} else if (word != 0) {
				show(" ");
				show(st2[2]);
				show(" ");
				pass(word);
			}
			number /= 1000;
			break;

		case 5:
			word = number % 100;
			if (word != 0) {
				show(" ");
				show(st2[3]);
				show(" ");
				pass(word);
			}
			number /= 100;
			break;
		}
		return number;
	}

	private void pass(int number) {
		int word, q;
		if (number < 10) {
			show(st1[number]);
		} else if (number < 20) {
			show(st3[number - 10]);
		} else if (number < 100) {
			word = number % 10;
			if (word == 0) {
				q = number / 10;
				show(st4[q - 2]);
			} else {
				q = number / 10;
				show(st1[word]);
				show(" ");
				show(st4[q - 2]);
			}
		} else {
			int n1 = 1;
			while (number != 0) {
				number = convertSeg(number, n1);
				n1++;
			}
		}
	}

	private void show(String s) {
		String st;
		st = string;
		string = s;
		string += st;
	}

	public static void main(String[] args) {
		NumToWords w = new NumToWords();
		Scanner input = new Scanner(System.in);
		// 123450.6789
		// should be:one hundred and twenty three thousand four hundred and
		// fifty dollars and 68 cents
		System.out.print("Enter Number: ");
		float num = input.nextFloat();
		String inwords = w.convert(num);
		System.out.println(inwords);
	}
}
最近下载更多
whhano  LV2 2023年12月20日
qazzaq11  LV1 2022年4月1日
袁泽宇  LV1 2022年3月2日
索索索索索索  LV1 2021年2月3日
陌上花开yue  LV2 2020年8月27日
echola  LV1 2020年4月27日
低调人  LV38 2020年3月24日
czsmosquito  LV1 2020年2月20日
Dl_Atuo  LV1 2019年12月6日
宋文豪  LV10 2019年11月20日
最近浏览更多
whhano  LV2 2023年12月20日
fesfefe  LV13 2023年11月11日
jinbaotest  LV1 2023年4月13日
ziyunyao 2023年2月24日
暂无贡献等级
浪里格朗  LV4 2023年1月31日
heqian  LV16 2022年11月29日
yuanmafx  LV4 2022年9月14日
Zeorwyc  LV8 2022年5月7日
qazzaq11  LV1 2022年4月1日
袁泽宇  LV1 2022年3月2日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友