将BigDecimal转成字符串为科学计数法的踩坑记录

目录
  • BigDecimal转字符串为科学计数法踩坑
    • 场景
    • 解决
    • 案例演示
  • BigDecimal变科学计数法

BigDecimal转字符串为科学计数法踩坑

场景

在开发工程中,在金额方面都会定义bigdecimal类型,当然有时候也需要将金额转成字符串。我们可能会很自然的写成 金额.toString()方法如:

costBudgetEntity.getInitTotalAmount().toString()//获取初始预算金额的字符串

当然当金额过小时,转成字符串,是没有任何问题的,但当金额数值较大时,转成的字符串时科学计数法格式,这往往不是我们想要的格式。

因此

costBudgetEntity.getInitTotalAmount().toString()//金额为12000000输出的结果为1.2E+7这种的字符串 

然后根据这种字符串,无法做一些想要的业务处理

解决

查看BigDecimal的API后,得知有个toPlainString()方法, 此方法的返回类型为String ,它返回此BigDecimal对象的字符串表示形式,不需要任何指数。

/**
* Returns a string representation of this {@code BigDecimal}
* without an exponent field.  For values with a positive scale,
* the number of digits to the right of the decimal point is used
* to indicate scale.  For values with a zero or negative scale,
* the resulting string is generated as if the value were
* converted to a numerically equal value with zero scale and as
* if all the trailing zeros of the zero scale value were present
* in the result.
*
* The entire string is prefixed by a minus sign character '-'
* (<tt>'\u002D'</tt>) if the unscaled value is less than
* zero. No sign character is prefixed if the unscaled value is
* zero or positive.
*
* Note that if the result of this method is passed to the
* {@linkplain #BigDecimal(String) string constructor}, only the
* numerical value of this {@code BigDecimal} will necessarily be
* recovered; the representation of the new {@code BigDecimal}
* may have a different scale.  In particular, if this
* {@code BigDecimal} has a negative scale, the string resulting
* from this method will have a scale of zero when processed by
* the string constructor.
*
* (This method behaves analogously to the {@code toString}
* method in 1.4 and earlier releases.)
*
* @return a string representation of this {@code BigDecimal}
* without an exponent field.
* @since 1.5
* @see #toString()
* @see #toEngineeringString()
*/
public String toPlainString() {
    if(scale==0) {
        if(intCompact!=INFLATED) {
            return Long.toString(intCompact);
        } else {
            return intVal.toString();
        }
    }
    if(this.scale<0) { // No decimal point
        if(signum()==0) {
            return "0";
        }
        int tailingZeros = checkScaleNonZero((-(long)scale));
        StringBuilder buf;
        if(intCompact!=INFLATED) {
            buf = new StringBuilder(20+tailingZeros);
            buf.append(intCompact);
        } else {
            String str = intVal.toString();
            buf = new StringBuilder(str.length()+tailingZeros);
            buf.append(str);
        }
        for (int i = 0; i < tailingZeros; i++)
            buf.append('0');
        return buf.toString();
    }
    String str ;
    if(intCompact!=INFLATED) {
        str = Long.toString(Math.abs(intCompact));
    } else {
        str = intVal.abs().toString();
    }
    return getValueString(signum(), str, scale);
}

此时,我们在debug查看:

costBudgetEntity.getInitTotalAmount().toPlainString() //金额为12000000输出的结果为12000000字符串

案例演示

BigDecimal变科学计数法

阿里OTS存储BigDecimal

当BigDecimal数据大于9,999,999时

后就变成科学计数法了。

如10,000,000 就变为1.0E7

接收端应该注意

也需要用BigDecimal,要是使用Integer接收,就可能出现异常

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java double转BigDecimal的注意事项说明

    先上结论: 不要直接用double变量作为构造BigDecimal的参数. 线上有这么一段Java代码逻辑: 1,接口传来一个JSON串,里面有个数字:57.3. 2,解析JSON并把这个数字保存在一个float变量. 3,把这个float变量赋值给一个 BigDecimal对象,用的是BigDecimal的double参数的构造: new BigDecimal(double val) 4,把这个BigDecimal保存到MySQL数据库,字段类型是decimal(15,2). 这段代码逻辑在线

  • Java将科学计数法数据转为字符串的实例

    有些项目可能会涉及到从Excel导入数据,但如果Excel里单元格类型为数值,但内容数据太长时(如银行账号),导入时,会默认读取为科学计数法,用以下代码便轻松解决. BigDecimal bd = new BigDecimal("3.40256010353E11");  System.out.println(bd.toPlainString()); 以上这篇Java将科学计数法数据转为字符串的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • 解决java读取EXCEL数据变成科学计数法的问题

    1.如下图中的检测值存到数据库是科学计数法 2 经过代码处理后 3 只需要对你读到的字符串进行如下操作 BigDecimal bd = new BigDecimal("读到的值"); String checkValue = bd.toPlainString(); 补充:java excel 导出时长数字变成科学计数法的解决方法 今天在做excel导出的时候,导出的表格中长度大于11的数字会自动用科学计数法显示. 一开始,我想着直接将数据全部转为string类型,没想到还是无法解决问题(

  • 解决Java中由于数据太大自动转换成科学计数法的问题

    1.java后台 (1)使用BigDecimal类 方式一:String str=new BigDecimal(num+"").toString(); 方式二:String str=new BigDecimal(num.toString()).toString(); (2)使用DecimalFormat类 //注意,这种方式是保留几位小数 String str=new DecimalFormat("0.00").format(num); 2.JSP页面 (1)使用j

  • 将BigDecimal转成字符串为科学计数法的踩坑记录

    目录 BigDecimal转字符串为科学计数法踩坑 场景 解决 案例演示 BigDecimal变科学计数法 BigDecimal转字符串为科学计数法踩坑 场景 在开发工程中,在金额方面都会定义bigdecimal类型,当然有时候也需要将金额转成字符串.我们可能会很自然的写成 金额.toString()方法如: costBudgetEntity.getInitTotalAmount().toString()//获取初始预算金额的字符串 当然当金额过小时,转成字符串,是没有任何问题的,但当金额数值较

  • php使用json_decode后数字对象转换成了科学计数法的解决方法

    本文实例讲述了php使用json_decode后数字对象转换成了科学计数法的解决方法.分享给大家供大家参考,具体如下: 问题: 今天在搞网页游戏在facebook积分上的对接,facebook传过来一个类json字符串,想在callball.php页面当中应用这些参数,于是进行了一次json_decode操作,发现长长的数字都变成了科学计数法,这不是我想要的结果. 解决方法: 做了各方面的转换处理都不好使: $obj='{"order_id":213477815351175,"

  • PHP实现将科学计数法转换为原始数字字符串的方法

    本文实例讲述了PHP实现将科学计数法转换为原始数字字符串的方法,分享给大家供大家参考. 具体实现代码如下: 复制代码 代码如下: function NumToStr($num){     if (stripos($num,'e')===false) return $num;     $num = trim(preg_replace('/[=\'"]/','',$num,1),'"');//出现科学计数法,还原成字符串     $result = "";     wh

  • 转换科学计数法的数值字符串为decimal类型的方法

    在操作数据库时,需要将字符串转换成decimal类型. 代码如下: select cast('0.12' as decimal(18,2)); select convert(decimal(18,2), '0.12'); 当需要将科学计数法的数字字符串转换成decimal时,这2种写法都报错: msg 8114, level 16, state 5, line 1 error converting data type varchar to numeric. select cast('0.12e+

  • 基于Java将Excel科学计数法解析成数字

    需要注意的是一般的科学表达式是 1.8E12 1.8E-12 而在Excel中的科学表达式是 1.8E+12 1.8E-12 我写的科学计数法的正则表达式是 (-?\d+\.?\d*)[Ee]{1}[\+-]?[0-9]* 导入EXCEL数据时将科学计数法解析成数字,Java代码: import java.text.DecimalFormat; import java.util.regex.Pattern; public class Test { static Pattern pattern =

  • java中将科学计数法转换普通计数法的简单方法

    今天发现数据库里汇总的数据有点大,一输出就被自动转化成科学计数法了.后来发现是转换字符串的方法有问题.如下: String a = "11234567.89"; BigDecimal db = new BigDecimal(a); System.out.println("科学计数:" + db.toString()); System.out.println("普通计数:" + db.toPlainString()); 输出: 科学计数:1.123

  • R语言数值取消科学计数法表示的操作

    我就废话不多说了,大家还是直接看代码吧~ >#取消科学计数法 >options(scipen = 200) >#scipen 表示在200个数字以内都不使用科学计数法 补充:R语言去除科学计数法 保留小数位 R语言 去除科学计数法 保留小数位 options("scipen"=100, "digits"=4) 补充:R语言科学计数法数据改变/丢失/失准,取消科学计数法的原因和解决方法 问题描述 如何在R中取消科学计数法 & 对R中使用科学技

  • pandas如何解决excel科学计数法问题

    目录 pandas解决excel科学计数法问题 亲测两个方法有效 pandas替换科学计数法数字 pandas解决excel科学计数法问题 excel默认处理超14位的数字成科学计数法,且后面的数字默认变0. 使用pandas合表或者生成新表时这是最恶心的问题. 亲测两个方法有效 1.若数据量不大,可将to_excel替换成to_csv,csv的包容性还是极强的,但当数据量庞大时,会遇到打不开的情况. 2.万能解法,read_excel时: df = pd.read_excel("filepat

随机推荐