Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用DecimalFormat将表示百分比、货币的数值转换为字符串并返回到BigDecimal_Java - Fatal编程技术网

Java 如何使用DecimalFormat将表示百分比、货币的数值转换为字符串并返回到BigDecimal

Java 如何使用DecimalFormat将表示百分比、货币的数值转换为字符串并返回到BigDecimal,java,Java,大家好,我想知道如何将表示数字、百分比、货币、整数的BigDecimal格式化为本地字符串,以及如何将字符串转换为BigDecimal。我使用的DecimalFormat功能强大,但我不确定如何在默认用户区域设置中使用转换为精确类型。我第一次使用这个: DecimalFormat.getCurrencyInstance().format( obj ); DecimalFormat.getCurrencyInstance().parse( source ); 但由于数量庞大,它歪曲了它们的价值。

大家好,我想知道如何将表示数字、百分比、货币、整数的BigDecimal格式化为本地字符串,以及如何将字符串转换为BigDecimal。我使用的DecimalFormat功能强大,但我不确定如何在默认用户区域设置中使用转换为精确类型。我第一次使用这个:

DecimalFormat.getCurrencyInstance().format( obj );
DecimalFormat.getCurrencyInstance().parse( source );
但由于数量庞大,它歪曲了它们的价值。所以我找到了一些东西,得到了这个:

DecimalFormat decimalFormat = new DecimalFormat();
decimalFormat.setParseBigDecimal( true );
BigDecimal bd = ( BigDecimal ) decimalFormat.parse( value );
但如何结合这些思考。我可能需要将NumberFormat.get???instance()中使用的某些模式设置为DecimalFormat,但我不知道如何以及是否会获得一些奇怪的行为


请有这方面经验的人帮我一下好吗?谢谢Pavel,我认为最好的选择是假设
getCurrencyInstance()
返回一个
DecimalFormat
,这可能在所有“重要”语言环境中都会发生。为了安全起见,您可以使用
instanceof

public static BigDecimal parseCurrencyPrecise (String value)
{
    NumberFormat  format = NumberFormat.getCurrencyInstance ();
    if (format instanceof DecimalFormat)
        ((DecimalFormat) format).setParseBigDecimal (true);

    Number  result = format.parse (value);
    if (result instanceof BigDecimal)
        return (BigDecimal) result;
    else {
        // Oh well...
        return new BigDecimal (result.doubleValue ());
    }
}

在我们的应用程序中,我们基本上对不同的内容执行相同的操作,您需要使用
SimpleDateFormat
,但在一般情况下只有
DateFormat

过一段时间后编写此代码。它似乎在工作,但我不确定它是否在所有时间都能正常工作。也许这对其他人有帮助。我也希望它不会违反任何许可证)

再过一次,我发现NumberFormat.get***Instance()方法返回其子类(DecimalFormat)。我不确定这是怎么回事,但它确实起作用了。在代码中,试图从LocaleServiceProviderPool获取格式,所以我相信它也会返回DecimalFormat,如果返回,使用这个原始方法并转换为DecimalFormat没有问题,但是如果没有,您必须检查它。在我写的代码中,这部分被省略了

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.ParseException;
import java.util.Currency;
import java.util.Locale;

import com.ibm.icu.impl.ICUResourceBundle;
import com.ibm.icu.text.NumberFormat;
import com.ibm.icu.util.UResourceBundle;

public class NumericHelper {

    public static BigDecimal parseStringToBigDecimal( String value, DecimalFormat decimalFormat ) throws ParseException {
        decimalFormat.setParseBigDecimal( true );
        return ( BigDecimal ) decimalFormat.parse( value );
    }

    /**
     * Extracted code from {@link NumberFormat#getPattern()} and
     * {@link java.text.NumberFormat#getInstance(Locale desiredLocale, int choice)} with some
     * modifications to get DecimalFormat with good Pattern
     * 
     * @param choice is static values from class {@link NumberFormat} eg
     *            {@link NumberFormat#INTEGERSTYLE}
     */
    public static DecimalFormat getDecimalFormatWithPattern( Locale desiredLocale, int choice ) {
        ICUResourceBundle rb = ( ICUResourceBundle ) UResourceBundle.getBundleInstance( ICUResourceBundle.ICU_BASE_NAME, desiredLocale );
        String[] numberPatterns = rb.getStringArray( "NumberPatterns" );

        DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance( desiredLocale );
        int entry = ( choice == NumberFormat.INTEGERSTYLE ) ? NumberFormat.NUMBERSTYLE : choice;
        DecimalFormat format = new DecimalFormat( numberPatterns[entry], symbols );

        if ( choice == NumberFormat.INTEGERSTYLE ) {
            format.setMaximumFractionDigits( 0 );
            format.setDecimalSeparatorAlwaysShown( false );
            format.setParseIntegerOnly( true );
        }
        else if ( choice == NumberFormat.CURRENCYSTYLE ) {
            adjustForCurrencyDefaultFractionDigits( format );
        }

        return format;
    }

    /**
     * Extracted from {@link DecimalFormat#adjustForCurrencyDefaultFractionDigits()} because it can
     * not be called
     */
    protected static void adjustForCurrencyDefaultFractionDigits( DecimalFormat decimalFormat ) {
        DecimalFormatSymbols symbols = decimalFormat.getDecimalFormatSymbols();

        Currency currency = symbols.getCurrency();
        if ( currency == null ) {
            try {
                currency = Currency.getInstance( symbols.getInternationalCurrencySymbol() );
            }
            catch ( IllegalArgumentException e ) {
            }
        }
        if ( currency != null ) {
            int digits = currency.getDefaultFractionDigits();
            if ( digits != -1 ) {
                int oldMinDigits = decimalFormat.getMinimumFractionDigits();
                // Common patterns are "#.##", "#.00", "#".
                // Try to adjust all of them in a reasonable way.
                if ( oldMinDigits == decimalFormat.getMaximumFractionDigits() ) {
                    decimalFormat.setMinimumFractionDigits( digits );
                    decimalFormat.setMaximumFractionDigits( digits );
                }
                else {
                    decimalFormat.setMinimumFractionDigits( Math.min( digits, oldMinDigits ) );
                    decimalFormat.setMaximumFractionDigits( digits );
                }
            }
        }
    }
}