java金额转换的问题,想要保留小数点后两位,这样会下标越界该怎么改?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java金额转换的问题,想要保留小数点后两位,这样会下标越界该怎么改?相关的知识,希望对你有一定的参考价值。
public static StringBuffer formatDoubleNum(double num, Boolean b)
StringBuffer sb = new StringBuffer();
BigDecimal b0 = new BigDecimal("100");
BigDecimal b1 = new BigDecimal("10000");
BigDecimal b2 = new BigDecimal("100000000");
BigDecimal b3 = new BigDecimal(num);
String formatNumStr = "";
String unit = "元";
// 以百为单位处理
if (b)
if (b3.compareTo(b0) == 0 || b3.compareTo(b0) == 1)
return sb.append("99+");
return sb.append(num);
// 以万为单位处理
if (b3.compareTo(b1) == -1)
formatNumStr = b3.toString();
else if ((b3.compareTo(b1) == 0 && b3.compareTo(b1) == 1)
|| b3.compareTo(b2) == -1)
unit = "万";
formatNumStr = b3.divide(b1).toString();
else if (b3.compareTo(b2) == 0 || b3.compareTo(b2) == 1)
unit = "亿";
formatNumStr = b3.divide(b2).toString();
if (!"".equals(formatNumStr))
int i = formatNumStr.indexOf(".");
if (i == -1)
sb.append(formatNumStr).append(unit);
else
// i = i + 2; //保留小数点后两位
i = i + 1; //保留小数点后一位
String v = formatNumStr.substring(i, i + 1);//这里会越界
if (!v.equals("0"))
sb.append(formatNumStr.substring(0, i + 1)).append(unit);//这里会越界
else
sb.append(formatNumStr.substring(0, i - 1)).append(unit);
if (sb.length() == 0)
return sb.append("0");
return sb;
哈?你的程序好复杂,我都没看明白
BigDecimal直接设置小数并设置四舍五入的方式不就好了吗?
public static void main(String[] args)
BigDecimal b0 = new BigDecimal("123");
BigDecimal b1 = new BigDecimal("1234");
BigDecimal b2 = new BigDecimal("12345");
BigDecimal b3 = new BigDecimal("123456");
BigDecimal b4 = new BigDecimal("1234567");
BigDecimal b5 = new BigDecimal("12345678");
BigDecimal b6 = new BigDecimal("123.45678");
BigDecimal b7 = new BigDecimal("123.45678");
System.out.println(b0.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
System.out.println(b1.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
System.out.println(b2.divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP));
System.out.println(b3.divide(new BigDecimal(10000), 2, RoundingMode.DOWN));
System.out.println(b4.divide(new BigDecimal(10000), 3, RoundingMode.HALF_UP));
System.out.println(b5.divide(new BigDecimal(100000), 3, RoundingMode.DOWN));
System.out.println(b6.setScale(2, RoundingMode.HALF_UP));
System.out.println(b7.setScale(2, RoundingMode.DOWN));
其中,setScale即设置小数位数是多少,RoundingMode表示四舍五入的方式,常用的就是HALF_UP表示四舍五入,DOWN表示直接舍掉,还有些其他的你查一下RoundingMode就行。
运行结果:
参考技术A 您好!您这个问题我也遇见过!以下是我的部分见解:检查 booking字符串,它被split(" ")之后,有可能少于5个字符串,赋值语句result[4]=ss[4]; 就会数组越界。非常感谢您的耐心观看,如有帮助请采纳,祝生活愉快!谢谢!只保留小数点后两位 C#
【中文标题】只保留小数点后两位 C#【英文标题】:Leave only two places past the decimal point C# 【发布时间】:2020-09-11 01:29:00 【问题描述】:我的问题和这个类似:
Leave only two decimal places after the dot
但是,这增加了复杂性。数值后缀可以变成任何单位,即
string test = "0.1542 Mol";
或
string test1 = "0.5247 ml";
基本上,我想要一些可以处理这两种情况的东西:
string test = "0.15 Mol";
和
string test1 = "0.52 ml";
【问题讨论】:
您应该将 data 与 representation 分开。话虽如此,您希望将 data 舍入到小数点后 2 位。之后,您可以通过附加一些空格、单位或其他内容将其转换为字符串。顺便说一句:您是否知道在您提到的帖子中还包含一个单元,可以将您的问题完全重复? 【参考方案1】:您需要拆分字符串,然后将值四舍五入。 String.Format ($) 也可以一步完成:
string test = "0.1542 Mol";
string[] testParts = test.Split(' ');
string rounded = $"Convert.ToDecimal(testParts[0]):0.00 testParts[1]";
小提琴:https://dotnetfiddle.net/EQsJGf
【讨论】:
与我的答案相同,只需几行,为什么不一直采用:string rounded = $"Convert.ToDecimal(test.Split(' ')[0]):0.00 test.Split(' ')[1]";
老实说,当谈到关于 String.Split 的代码效率时,我总是犹豫不决。我知道我们只是在谈论几纳秒和几个字节的内存,但我从来没有真正弄清楚在内部级别(处理器和内存方面)什么更有效。拆分字符串并存储其值,或重复拆分字符串而不使用存储变量。
知道会很有趣:)
看起来,至少对于处理器部分,我存储拆分的方法更有效:dotnetfiddle.net/BMr9Xh
秒表是一个有趣的小工具。【参考方案2】:
更新
您可以使用正则表达式:
var s = "0.153567 Mol";
var num = Regex.Replace(s, @"^([0-9]+\.[0-9]2)([0-9]*)(\s+.+)", "$1$3");
// Output: 0.15 Mol
更新 2
如果你需要对数字进行四舍五入,你仍然可以使用Regex(模式有点改变):
string[] nums = "0.154567 Mol", "0.158963 ml" ;
foreach (var num in nums)
var s = Regex.Replace(num, @"^([0-9]+\.[0-9]+)(\s+.+)",
m => $"Math.Round(decimal.Parse(m.Groups[1].Value), 2)m.Groups[2].Value");
Console.WriteLine(s);
// Output:
// 0.15 Mol
// 0.16 ml
【讨论】:
@jscarle 不了解地板和圆形。 OP不需要在两位数之后(逗号之后)去除剩余的数字吗? 我并没有说这是错误的,这只是一个观察。我是说使用 Regex 本身是 Math.Floor 的同义词,而使用 String.Format 是 Math.Round 的同义词。 OP没有明确说明他期望的是哪一个。 @bobsyauncle 好吧,仍然可以使用 Regex 对数字进行四舍五入 :) @bobsyauncle 我已经更新了代码 - 您也可以使用正则表达式对数字进行舍入(更新 2)。 ? @jscarle 添加了带舍入的版本(更新 2)。 ?【参考方案3】:您需要先将您的字符串转换为可以四舍五入的双精度,然后添加原始单位重新格式化为文本:
string inputText = "0.1542 Mol";
double inputNumber = Convert.ToDouble(inputText.Split(' ')[0]);
double outputNumber = Math.Round(inputNumber, 2);
string outputText = outputNumber + " " + inputText.Split(' ')[1];
【讨论】:
【参考方案4】:var splittedString = variable.Split(" ");
var number = String.Format("0:0.00", splittedString[0]);
var result = number + " " + splittedString[1] ;
【讨论】:
【参考方案5】:我不是 C# 人,但由于没有其他人为您回答过这个问题,鉴于我在其他语言方面的经验,我会尽力提供帮助。我建议以下解决方案:
将字符串视为以空格为分隔符的分隔字符串。 搜索空格的位置,将左侧部分复制到一个变量,将右侧版本复制到另一个变量。 C# 中的 IndexOf() 和 subString() 方法在这里可能很有用。 然后将左侧变量转换为数值,并将其转换回具有适当精度的字符串。把它和右边的字符串结合起来,你就会得到你想要的。
这里是另一个线程的链接,关于如何获得您想要的精度:
Formatting a float to 2 decimal places
【讨论】:
以上是关于java金额转换的问题,想要保留小数点后两位,这样会下标越界该怎么改?的主要内容,如果未能解决你的问题,请参考以下文章