BigDecimal is converted into a string for scientific notation

One, the scene

    In the development project, the bigdecimal type will be defined in terms of the amount. Of course, sometimes the amount needs to be converted into a string. We may naturally write the amount. ToString() method such as:

costBudgetEntity.getInitTotalAmount().toString()//Get the string of the initial budget amount

 

Of course, when the amount is too small, there is no problem in converting it into a string, but when the amount is large, the converted string is in scientific notation format, which is often not the format we want.

 

therefore

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

Then according to this string, it is impossible to do some business processing that you want

 

Two, solve

        After looking at the BigDecimal API, I learned that there is a toPlainString() method. The return type of this method is String. It returns the string representation of this BigDecimal object without any exponent.

/**
* 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>'&#92;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);
}

At this point, we view in debug:

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

Three, case demonstration

 

Guess you like

Origin blog.csdn.net/qq_35340913/article/details/109243688