need space between currency symbol and amount

前端 未结 5 800
余生分开走
余生分开走 2021-02-13 13:09

I\'m trying to print INR format currency like this:

NumberFormat fmt = NumberFormat.getCurrencyInstance();
fmt.setCurrency(Currency.getInstance(\"INR\"));
fmt.fo         


        
相关标签:
5条回答
  • 2021-02-13 13:18

    It's a bit of a hack but in a very similar situation, I used something like this

    NumberFormat format = NumberFormat.getCurrencyInstance(new Locale("en", "in"));
    String currencySymbol = format.format(0.00).replace("0.00", "");
    System.out.println(format.format(30382.50).replace(currencySymbol, currencySymbol + " "));
    

    all the currencies I had to deal with involved two decimal places so i was able to do "0.00" for all of them but if you plan to use something like Japanese Yen, this has to be tweaked. There is a NumberFormat.getCurrency().getSymbol(); but it returns INR instead for Rs. so that cannot be used for getting the currency symbol.

    0 讨论(0)
  • 2021-02-13 13:20

    An easier method, kind of workaround. For my locale, the currency symbol is "R$"

    public static String moneyFormatter(double d){
    
        DecimalFormat fmt = (DecimalFormat) NumberFormat.getInstance();
        Locale locale = Locale.getDefault();
        String symbol = Currency.getInstance(locale).getSymbol(locale);
        fmt.setGroupingUsed(true);
        fmt.setPositivePrefix(symbol + " ");
        fmt.setNegativePrefix("-" + symbol + " ");
        fmt.setMinimumFractionDigits(2);
        fmt.setMaximumFractionDigits(2);
        return fmt.format(d);
    }
    

    Input:

    moneyFormatter(225.0);
    

    Output:

    "R$ 225,00"
    
    0 讨论(0)
  • 2021-02-13 13:29

    I don't see any easy way to do this. Here's what I came up with...

    The key to getting the actual currency symbol seems to be passing the destination locale into Currency.getSymbol:

    currencyFormat.getCurrency().getSymbol(locale)
    

    Here's some code that seems like it mostly works:

    public static String formatPrice(String price, Locale locale, String currencyCode) {
    
        NumberFormat currencyFormat = NumberFormat.getCurrencyInstance(locale);
        Currency currency = Currency.getInstance(currencyCode);
        currencyFormat.setCurrency(currency);
    
        try {
            String formatted = currencyFormat.format(NumberFormat.getNumberInstance().parse(price));
            String symbol = currencyFormat.getCurrency().getSymbol(locale);
    
            // Different locales put the symbol on opposite sides of the amount
            // http://en.wikipedia.org/wiki/Currency_sign
            // If there is already a space (like the fr_FR locale formats things),
            // then return this as is, otherwise insert a space on either side
            // and trim the result
            if (StringUtils.contains(formatted, " " + symbol) || StringUtils.contains(formatted, symbol + " ")) {
                return formatted;
            } else {
                return StringUtils.replaceOnce(formatted, symbol, " " + symbol + " ").trim();
            }
        } catch (ParseException e) {
            // ignore
        }
        return null;
    }
    
    0 讨论(0)
  • 2021-02-13 13:30

    See if this works:

    DecimalFormat fmt = (DecimalFormat) NumberFormat.getInstance();
    fmt.setGroupingUsed(true);
    fmt.setPositivePrefix("Rs. ");
    fmt.setNegativePrefix("Rs. -");
    fmt.setMinimumFractionDigits(2);
    fmt.setMaximumFractionDigits(2);
    fmt.format(30382.50);
    

    Edit: Fixed the first line.

    0 讨论(0)
  • 2021-02-13 13:40

    I dont think you can.

    You should take a look at http://site.icu-project.org/

    There might be better locale-specific currency formatting provided by icu4j.

    0 讨论(0)
提交回复
热议问题