「货币转化java」货币转化为资本的决定性前提是

博主:adminadmin 2023-03-23 01:50:07 800

本篇文章给大家谈谈货币转化java,以及货币转化为资本的决定性前提是对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java简单题:一组金额数据,用人民币大写显示出来

/**

 * 程序目的:

 *   从命令行接收一个数,并将其转化为中文金额的大写方式

 * 例如 123.45 -- 壹佰贰拾叁元肆角伍分

 * @author gdb

 *

 * 实在是不符合规范,程序里面的算法没有让人明白得很清楚的注释,读上去觉得有

 * 点难度,可读性不强。而且很多程序还存在不少bug,随便一测就测出来了。

 *   所以本人还是决定重新写一下这个程序,并且尽量做到消除不必要的bug。这个程

 * 序我没有用什么很精妙的算法,不过用了一些Java类库中的类,像是正则表达式之类

 * 

 */

public class Trans2RMB {

/**

 * 测试程序的可行性

 * @param args

 */

public static void main(String[] args) {

System.out.println("\n--------将数字转换成中文金额的大写形式------------\n");

Trans2RMB t2r = new Trans2RMB();

String s = t2r.cleanZero(t2r.splitNum(t2r.roundString(t2r.getNum())));

// 如果转换过后是一个空串,则不输出屏幕

if(!"".equals(s)) {

System.out.println("转换成中文后为:" + s);;

}

System.out.println("\n---------------------------------------------");

}

/**

 * 从命令行接收一个数,在其中调用 checkNum() 方法对其进行

 * 验证,并返回相应的值

 * @return 如果输入合法,返回输入的这个数

 */

private String getNum() {

String s = null;

System.out.println("请输入一个数字(精确到小数点后两位):");

// 从命令行输入这个浮点数

java.util.Scanner scanner = new java.util.Scanner(System.in);

s = scanner.next();

// 关闭这个Scanner

scanner.close();

// 判断用户输入是否合法

// 若合法,返回这个值;若非法返回 "0"

if(this.checkNum(s)) {

return s;

} else {

return "";

}

}

/**

 * 判断用户输入的数据是否合法,用户只能输入大于零的数字,不能输入其它字符

 * @param s String

 * @return 如果用户输入数据合法,返回 true,否则返回 false

 */

private boolean checkNum(String s) {

// 如果用户输入的数里有非数字字符,则视为非法数据,返回 false

try {

float f = Float.valueOf(s);

// 如果这个数小于零则视为非法数据,返回 false

if(f  0) {

System.out.println("非法数据,请检查!");

return false;

}else {

return true;

}

} catch (NumberFormatException e) {

System.out.println("非法数据,请检查!");

return false;

}

}

/**

 * 把用户输入的数以小数点为界分割开来,并调用 numFormat() 方法

 * 进行相应的中文金额大写形式的转换

 * 注:传入的这个数应该是经过 roundString() 方法进行了四舍五入操作的

 * @param s String

 * @return 转换好的中文金额大写形式的字符串

 */

private String splitNum(String s) {

// 如果传入的是空串则继续返回空串

if("".equals(s)) {

return "";

}

// 以小数点为界分割这个字符串

int index = s.indexOf(".");

// 截取并转换这个数的整数部分

String intOnly = s.substring(0, index);

String part1 = this.numFormat(1, intOnly);

// 截取并转换这个数的小数部分

String smallOnly = s.substring(index + 1);

String part2 = this.numFormat(2, smallOnly);

// 把转换好了的整数部分和小数部分重新拼凑一个新的字符串

String newS = part1 + part2;

return newS;

}

/**

 * 对传入的数进行四舍五入操作

 * @param s String 从命令行输入的那个数

 * @return 四舍五入后的新值

 */

private String roundString(String s) {

// 如果传入的是空串则继续返回空串

if("".equals(s)) {

return "";

}

// 将这个数转换成 double 类型,并对其进行四舍五入操作

double d = Double.parseDouble(s);

// 此操作作用在小数点后两位上

d = (d * 100 + 0.5) / 100;

// 将 d 进行格式化

s = new java.text.DecimalFormat("##0.000").format(d);

// 以小数点为界分割这个字符串

int index = s.indexOf(".");

// 这个数的整数部分

String intOnly = s.substring(0, index);

// 规定数值的最大长度只能到万亿单位,否则返回 "0"

if(intOnly.length()  13) {

System.out.println("输入数据过大!(整数部分最多13位!)");

return "";

}

// 这个数的小数部分

String smallOnly = s.substring(index + 1);

// 如果小数部分大于两位,只截取小数点后两位

if(smallOnly.length()  2) {

String roundSmall = smallOnly.substring(0, 2);

// 把整数部分和新截取的小数部分重新拼凑这个字符串

s = intOnly + "." + roundSmall;

}

return s;

}

/**

 * 把传入的数转换为中文金额大写形式

 * @param flag int 标志位,1 表示转换整数部分,0 表示转换小数部分

 * @param s String 要转换的字符串

 * @return 转换好的带单位的中文金额大写形式

 */

private String numFormat(int flag, String s) {

int sLength = s.length();

// 货币大写形式

String bigLetter[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

// 货币单位

String unit[] = {"元", "拾", "佰", "仟", "万", 

// 拾万位到仟万位

"拾", "佰", "仟",

// 亿位到万亿位

"亿", "拾", "佰", "仟", "万"};

String small[] = {"分", "角"};

// 用来存放转换后的新字符串

String newS = "";

// 逐位替换为中文大写形式

for(int i = 0; i  sLength; i ++) {

if(flag == 1) {

// 转换整数部分为中文大写形式(带单位)

newS = newS + bigLetter[s.charAt(i) - 48] + unit[sLength - i - 1];

} else if(flag == 2) {

// 转换小数部分(带单位)

newS = newS + bigLetter[s.charAt(i) - 48] + small[sLength - i - 1];

}

}

return newS;

}

/**

 * 把已经转换好的中文金额大写形式加以改进,清理这个字

 * 符串里面多余的零,让这个字符串变得更加可观

 * 注:传入的这个数应该是经过 splitNum() 方法进行处理,这个字

 * 符串应该已经是用中文金额大写形式表示的

 * @param s String 已经转换好的字符串

 * @return 改进后的字符串

 */

private String cleanZero(String s) {

// 如果传入的是空串则继续返回空串

if("".equals(s)) {

return "";

}

// 如果用户开始输入了很多 0 去掉字符串前面多余的'零',使其看上去更符合习惯

while(s.charAt(0) == '零') {

// 将字符串中的 "零" 和它对应的单位去掉

s = s.substring(2);

// 如果用户当初输入的时候只输入了 0,则只返回一个 "零"

if(s.length() == 0) {

return "零";

}

}

// 字符串中存在多个'零'在一起的时候只读出一个'零',并省略多余的单位

/* 由于本人对算法的研究太菜了,只能用4个正则表达式去转换了,各位大虾别介意哈... */

String regex1[] = {"零仟", "零佰", "零拾"};

String regex2[] = {"零亿", "零万", "零元"};

String regex3[] = {"亿", "万", "元"};

String regex4[] = {"零角", "零分"};

// 第一轮转换把 "零仟", 零佰","零拾"等字符串替换成一个"零"

for(int i = 0; i  3; i ++) {

s = s.replaceAll(regex1[i], "零");

}

// 第二轮转换考虑 "零亿","零万","零元"等情况

// "亿","万","元"这些单位有些情况是不能省的,需要保留下来

for(int i = 0; i  3; i ++) {

// 当第一轮转换过后有可能有很多个零叠在一起

// 要把很多个重复的零变成一个零

s = s.replaceAll("零零零", "零");

s = s.replaceAll("零零", "零");

s = s.replaceAll(regex2[i], regex3[i]);

}

// 第三轮转换把"零角","零分"字符串省略

for(int i = 0; i  2; i ++) {

s = s.replaceAll(regex4[i], "");

}

// 当"万"到"亿"之间全部是"零"的时候,忽略"亿万"单位,只保留一个"亿"

s = s.replaceAll("亿万", "亿");

return s;

}

}

JAVA的一个面试题?谁帮我解决下?

public class MoneyUtil {

public static String[] chineseDigits = new String[] { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};

/**

* 把金额转换为汉字表示的数量,小数点后四舍五入保留两位

* @param amount

* @return

*/

public static String amountToChinese(double amount) {

if(amount 99999999999999.99 || amount -99999999999999.99)

throw new IllegalArgumentException("参数值超出允许范围 (-99999999999999.99 ~ 99999999999999.99)!");

boolean negative = false;

if(amount 0) {

negative = true;

amount = amount * (-1);

}

long temp = Math.round(amount * 100);

int numFen = (int)(temp % 10); // 分

temp = temp / 10;

int numJiao = (int)(temp % 10); //角

temp = temp / 10;

//temp 目前是金额的整数部分

int[] parts = new int[20]; // 其中的元素是把原来金额整数部分分割为值在 0~9999 之间的数的各个部分

int numParts = 0; // 记录把原来金额整数部分分割为了几个部分(每部分都在 0~9999 之间)

for(int i=0; ; i++) {

if(temp ==0)

break;

int part = (int)(temp % 10000);

parts[i] = part;

numParts ++;

temp = temp / 10000;

}

boolean beforeWanIsZero = true; // 标志“万”下面一级是不是 0

String chineseStr = "";

for(int i=0; inumParts; i++) {

String partChinese = partTranslate(parts[i]);

if(i % 2 == 0) {

if("".equals(partChinese))

beforeWanIsZero = true;

else

beforeWanIsZero = false;

}

if(i != 0) {

if(i % 2 == 0)

chineseStr = "亿" + chineseStr;

else {

if("".equals(partChinese) !beforeWanIsZero) // 如果“万”对应的 part 为 0,而“万”下面一级不为 0,则不加“万”,而加“零”

chineseStr = "零" + chineseStr;

else {

if(parts[i-1] 1000 parts[i-1] 0) // 如果"万"的部分不为 0, 而"万"前面的部分小于 1000 大于 0, 则万后面应该跟“零”

chineseStr = "零" + chineseStr;

chineseStr = "万" + chineseStr;

}

}

}

chineseStr = partChinese + chineseStr;

}

if("".equals(chineseStr)) // 整数部分为 0, 则表达为"零元"

chineseStr = chineseDigits[0];

else if(negative) // 整数部分不为 0, 并且原金额为负数

chineseStr = "负" + chineseStr;

chineseStr = chineseStr + "元";

if(numFen == 0 numJiao == 0) {

chineseStr = chineseStr + "整";

}

else if(numFen == 0) { // 0 分,角数不为 0

chineseStr = chineseStr + chineseDigits[numJiao] + "角";

}

else { // “分”数不为 0

if(numJiao == 0)

chineseStr = chineseStr + "零" + chineseDigits[numFen] + "分";

else

chineseStr = chineseStr + chineseDigits[numJiao] + "角" + chineseDigits[numFen] + "分";

}

return chineseStr;

}

/**

* 把一个 0~9999 之间的整数转换为汉字的字符串,如果是 0 则返回 ""

* @param amountPart

* @return

*/

private static String partTranslate(int amountPart) {

if(amountPart 0 || amountPart 10000) {

throw new IllegalArgumentException("参数必须是大于等于 0,小于 10000 的整数!");

}

String[] units = new String[] {"", "拾", "佰", "仟"};

int temp = amountPart;

String amountStr = new Integer(amountPart).toString();

int amountStrLength = amountStr.length();

boolean lastIsZero = true; //在从低位往高位循环时,记录上一位数字是不是 0

String chineseStr = "";

for(int i=0; iamountStrLength; i++) {

if(temp == 0) // 高位已无数据

break;

int digit = temp % 10;

if(digit == 0) { // 取到的数字为 0

if(!lastIsZero) //前一个数字不是 0,则在当前汉字串前加“零”字;

chineseStr = "零" + chineseStr;

lastIsZero = true;

}

else { // 取到的数字不是 0

chineseStr = chineseDigits[digit] + units[i] + chineseStr;

lastIsZero = false;

}

temp = temp / 10;

}

return chineseStr;

}

public static void main(String[] args) {

if(args.length == 0) {

System.out.println("转换演示:");

System.out.println("-------------------------");

System.out.println("25000000000005.999: " + amountToChinese(25000000000005.999));

System.out.println("45689263.626: " + amountToChinese(45689263.626));

System.out.println("0.69457: " + amountToChinese(0.69457));

System.out.println("253.0: " + amountToChinese(253.0));

System.out.println("0: " + amountToChinese(0));

System.out.println("-------------------------");

//System.out.println(Long.MAX_VALUE);

//System.out.println(Long.MIN_VALUE);

}

else {

System.out.println("转换结果:");

System.out.println(args[0] + ": " + amountToChinese(Double.parseDouble(args[0])));

}

}

}

在java里,如何将double类型的数字转换成货币那种形式,数字是用逗号分开的那种

Format fm1=new DecimalFormat("#,###.00");

double num1=12345.678;

fm1.format(num1);

可以自己在程序里试试哈。

将数字货币金额转换为大写格式

【实例描述】

在处理财务账款时,一般需要使用大写金额。如果在银行进行储蓄或转账,也需要将数字金

额写成大写格式。也就是说,如果要转账123456元,则

需要写成“壹拾贰万叁仟肆佰伍拾陆元整”。对于这种情

况,如果手动填写不仅麻烦,而且容易出错,所以我们

可以设计一个程序来自动完成数字格式的转换。本实例

实现了小写金额到大写金额的转换,实例的运行效果如

图4.2所示。

图4.2将数字货币金额转换为大写格式

【实现过程】

(1)在Eclipse中新建项目MoneyConvert,并在其中创建一个MoneyConvert.java文件。

在该类的主方法中创建标准输入流的扫描器对象,接收用户输入的数字金额。然后在通过

convert()方法把这个金额转换成大写金额的字符串格式,并输出到控制台。核心代码如下所示:

publicstaticvoidmain(String[]args){

Scannerscan=newScanner(System.in);//创建扫描器

System.out.println("请输入一个金额");

//获取金额转换后的字符串

Stringconvert=convert(scan.nextDouble());

System.out.println(convert);//输出转换结果

}

(2)编写金额转换方法convert(),该方法在主方法中被调用,用于金额数字向大写格式的

转换。在该方法中创建DecimalFormat类的实例对象,通过这个格式器对象把金额数字格式化,

只保留三位小数。然后分别调用getInteger()与getDecimal()方法转换整数与小数部分,并返回

转换后的结果。关键代码如下:

publicstaticStringconvert(doubled){

//实例化DecimalFormat对象

DecimalFormatdf=newDecimalFormat("#0.###");

//格式化double数字

StringstrNum=df.format(d);

//判断是否包含小数点

if(strNum.indexOf(".")!=-1){

Stringnum=strNum.substring(0,strNum.indexOf("."));

//整数部分大于12不能转换

if(num.length()12){

System.out.println("数字太大,不能完成转换!");

return"";

}

}

Stringpoint="";//小数点

if(strNum.indexOf(".")!=-1){

point="元";

}else{

point="元整";

}

//转换结果

Stringresult=getInteger(strNum)+point+getDecimal(strNum);

if(result.startsWith("元")){//判断是字符串是否已"元"结尾

result=result.substring(1,result.length());//截取字符串

}

returnresult;//返回新的字符串

}

(3)编写getInteger()方法,用于转换数字整数部分的大写格式。在该方法中判断数字是否

包含小数点,然后把数字转换为字符串并反转字符顺序,为每个数字添加对应的大写单位。关

键代码如下:

publicstaticStringgetInteger(Stringnum){

if(num.indexOf(".")!=-1){//判断是否包含小数点

um=num.substring(0,num.indexOf("."));

}

um=newStringBuffer(num).reverse().toString();//反转字符串

StringBuffertemp=newStringBuffer();//创建一个StringBuffer

对象

for(inti=0;inum.length();i++){//加入单位

temp.append(STR_UNIT[i]);

temp.append(STR_NUMBER[num.charAt(i)-48]);

}

um=temp.reverse().toString();//反转字符串

um=numReplace(num,"零拾","零");//替换字符串的字符

um=numReplace(num,"零佰","零");//替换字符串的字符

um=numReplace(num,"零仟","零");//替换字符串的字符

um=numReplace(num,"零万","万");//替换字符串的字符

um=numReplace(num,"零亿","亿");//替换字符串的字符

um=umReplace(num,"零零","零");//替换字符串的字符

um=numReplace(num,"亿万","亿");//替换字符串的字符

//如果字符串以零结尾将其除去

if(num.lastIndexOf("零")==num.length()-1){

um=num.substring(0,num.length()-1);

}

returnum;

}

publicstaticStringgetDecimal(Stringnum){

//判断是否包含小数点

if(num.indexOf(".")==-1){

return"";

}

um=um.substring(num.indexOf(".")+1);

//反转字符串

um=newStringBuffer(num).reverse().toString();

//创建一个StringBuffer对象

StringBuffertemp=newStringBuffer();

//加入单位

for(inti=0;inum.length();i++){

temp.append(STR_UNIT2[i]);

temp.append(STR_NUMBER[num.charAt(i)-48]);

}

um=temp.reverse().toString();//替换字符串的字符

um=umReplace(num,"零角","零");//替换字符串的字符

um=numReplace(num,"零分","零");//替换字符串的字符

um=numReplace(num,"零厘","零");//替换字符串的字符

um=umReplace(num,"零零","零");//替换字符串的字符

//如果字符串以零结尾将其除去

if(num.lastIndexOf("零")==num.length()-1){

um=num.substring(0,um.length()-1);

}

returnnum;

}

publicstaticStringumReplace(Stringnum,StringoldStr,StringnewStr)

{

while(true){

//判断字符串中是否包含指定字符

if(num.indexOf(oldStr)==-1){

break;

}

//替换字符串

num=num.replaceAll(oldStr,newStr);

}

//返回替换后的字符串

returnum;

}

【代码解析】

实现本实例的关键在于以下几点:

_将数字格式化,如果存在小数部分,将其转换为3位小数,精确到厘。

_分别将整数部分与小数部分转换为大写格式,并插入其单位(亿、万、仟??)。

_组合转换后的整数部分与小数部分。

【知识扩展】

DecimalFormat类可以指定格式化模板来格式化浮点数,如保留几位小数。通过调用该类

的format()方法可以使用指定模板来格式化任意浮点数字。

货币转化java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于货币转化为资本的决定性前提是、货币转化java的信息别忘了在本站进行查找喔。