web-dev-qa-db-ja.com

インドの番号形式で通貨を表示する

ルピー通貨のフォーマットについて質問があります(インドルピー-INR)。

通常、450500のような値は450,500としてフォーマットされ表示されます。インドでは、4,50,500と同じ値が表示されます

たとえば、ここの数字は次のように表されます。

1
10
100
1,000
10,000
1,00,000
10,00,000
1,00,00,000
10,00,00,000

参照 インドのナンバリングシステム

区切り文字は2桁の後にありますが、最後のセットは千単位です。

インターネットで検索したところ、人々はロケールen_GBまたはパターン#,##,##,##,##0.00の使用を求めました

次のタグを使用して、JSTLでこれを試しました。

<fmt:formatNumber value="${product.price}" type="currency" 
  pattern="#,##,##,##,###.00"/>

しかし、これは問題を解決しないようです。この問題の助けは大歓迎です。

ありがとう

47
Mihir

残念ながら DecimalFormat は可変幅グループをサポートしていません。そのため、あなたが望むように値を正確にフォーマットすることはありません:

複数のグループ化文字を含むパターンを指定する場合、最後の文字と整数の最後の間隔が使用されます。だから_"#,##,###,####" == "######,####" == "##,####,####"_。

Javaのほとんどの数値書式メカニズムはそのクラスに基づいているため、この欠陥を継承しています。

ICU4J(Javaバージョンの International Components for Unicode )は、 NumberFormatdoesがこのフォーマットをサポートするクラス:

_Format format = com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("en", "in"));
System.out.println(format.format(new BigDecimal("100000000")));
_

このコードは次の出力を生成します。

Rs 10,00,00,000.00

注:_com.ibm.icu.text.NumberFormat_クラスはnotを拡張します _Java.text.NumberFormat_ クラス(既にICU内部の基本クラスを拡張しているため)doesただし、 _Java.text.Format_format(Object) メソッドを持つクラス。

61
Joachim Sauer

Androidでは、これは私のために働いた:

new DecimalFormat("##,##,##0").format(amount);

450500は4,50,500としてフォーマットされます

http://developer.Android.com/reference/Java/text/DecimalFormat.html -DecimalFormatは、2つのグループ化サイズをサポートしています。1つはプライマリグループ化サイズで、もう1つは他のすべてに使用されます。

20
Kiran

ここにあなたができる簡単なこと、

 float amount = 100000;

 NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));

 String moneyString = formatter.format(amount);

 System.out.println(moneyString);

出力はRs.100,000.00になります。

9
CleanX

私も同じ問題に陥りました。私はDecimalFormatで働いていました。

JSTLの知識はありませんが、私のソリューションで何かを理解できます。

として、グループ化サイズはDecimalFormatで一定のままです。両方の部分を分離し、異なるパターンでフォーマットし、両方を連結しました。これがコードです。

public static String format(double value) {
    if(value < 1000) {
        return format("###", value);
    } else {
        double hundreds = value % 1000;
        int other = (int) (value / 1000);
        return format(",##", other) + ',' + format("000", hundreds);
    }
}

private static String format(String pattern, Object value) {
    return new DecimalFormat(pattern).format(value);
}

Indian Numbering Systemのような形式を提供します。

小数点が必要な場合は、".##"両方の条件。

"###"から"###.##"および"000"から"000.##"

5
Akshat

簡単な解決策は-

Double amount = 5356673553123.0; //amount is an example ,can be used with any double value

**DecimalFormat IndianCurrencyFormat = new DecimalFormat("##,##,###.00");**

次にそれを使用します-

String formattedAmount = IndianCurrencyFormat.format(amount);
4
NikHiL Bonte

使用可能なデフォルトのロケールがなく、ユーザーがロケールに変更を加えない場合、Unicodeおよび10進形式を使用して通貨記号を設定できます。以下のコードのように:

例えばインドの通貨記号を設定し、値をフォーマットします。これは、ユーザーが設定を変更しなくても機能します。

    Locale locale = new Locale("en","IN");
    DecimalFormat decimalFormat = (DecimalFormat) DecimalFormat.getCurrencyInstance(locale);
    DecimalFormatSymbols dfs = DecimalFormatSymbols.getInstance(locale);
    dfs.setCurrencySymbol("\u20B9");
    decimalFormat.setDecimalFormatSymbols(dfs);
    System.out.println(decimalFormat.format(payment));

出力:

₹12,324.13
3
public String getIndianCurrencyFormat(String amount) {
    StringBuilder stringBuilder = new StringBuilder();
    char amountArray[] = amount.toCharArray();
    int a = 0, b = 0;
    for (int i = amountArray.length - 1; i >= 0; i--) {
        if (a < 3) {
            stringBuilder.append(amountArray[i]);
            a++;
        } else if (b < 2) {
            if (b == 0) {
                stringBuilder.append(",");
                stringBuilder.append(amountArray[i]);
                b++;
            } else {
                stringBuilder.append(amountArray[i]);
                b = 0;
            }
        }
    }
    return stringBuilder.reverse().toString();
}

これは、インドの通貨形式を取得するために私がやったことです。入力が1234567890の場合、出力は1,23,45,67,890になります。

3
Palanivelraghul

enter image description here[$ = CODE!]

  public static String rupeeFormat(String value){
            value=value.replace(",","");
            char lastDigit=value.charAt(value.length()-1);
            String result = "";
            int len = value.length()-1;
            int nDigits = 0;

            for (int i = len - 1; i >= 0; i--)
            {
                result = value.charAt(i) + result;
                nDigits++;
                if (((nDigits % 2) == 0) && (i > 0))
                {
                    result = "," + result;
                }
            }
            return (result+lastDigit);
        }
2
Nishant Shah

Kotlinバージョン、動作するAndroid API 26

fun currencyLocale(value: Double): String {
    val formatter = NumberFormat.getCurrencyInstance(Locale("en", "in"))
    return formatter.format(value)
}

fun parseCommaSeparatedCurrency(value: String): Number {
    return NumberFormat.getCurrencyInstance(Locale("en", "in")).parse(value)
}
2
Kavin Varnan
//Input:
long num = 450500;

// Unlike other countries, there is no direct Locale field for India.Therefore, we need to construct a locale for India.
Locale loc = new Locale("en", "in"); // This will display currency with "Rs." symbol.

// or use below to display currency with "INR" symbol.
Locale loc = new Locale("", "in");

NumberFormat indiacurrency = NumberFormat.getCurrencyInstance(loc);
String result = indiacurrency.format(num);
System.out.print(result);
1
G M

On Android android.icu.text.NumberFormatはAPIレベル24以降でのみ使用可能です。したがって、下位バージョンをサポートするために、Javaで独自のメソッドを作成しました。

public static String formatIndianCommaSeparated(long rupee){
    // remove sign if present
    String raw = String.valueOf(Math.abs(rupee));
    int numDigits = raw.length();
    StringBuilder sb = new StringBuilder(raw);
    // Reverse the string to start from right most digits
    sb = sb.reverse();
    // Counter to keep track of number of commas placed
    int commas = 0;
    for (int i=0; i<numDigits; i++){
        // Insert a comma if i is in the range [3, 5, 7, 9, ...)
        if (i % 2 == 1 && i != 1 ){
            sb.insert(i+commas, ",");
            commas++;
        }
    }
    // Reverse the string back to get original number
    String sign = (rupee < 0) ? "-" : "";
    return sign + sb.reverse().toString();
}
1
ankit209

既存のライブラリのデフォルトのメソッドは、数千のセパレーターのみを表示できます。そのため、このためのカスタム関数を作成する必要があります。複数の部分文字列操作を使用して、目的の結果を得ることができます。

Javaでは、

function indianCurrencyNumberFormat(rupee) {
    string explore_remaining_units = "";
    if (rupee.length() > 3) {
        last_three_digits = rupee.substring((rupee.length()-3), rupee.length());
        remaining_units = rupee.substring(0, (rupee.length()-3)); 
        remaining_units =  ((remaining_units.length()) % 2 == 1) ? "0"+remaining_units : remaining_units; 
        split_rupee = remaining_units.split("(?<=^(.{2})+)")
        for (i = 0; i < sizeof(split_rupee); i++) {
          explore_remaining_units += ((i == 0) ? ( (int) split_rupee[i]+"," ) : ( split_rupee[i]+"," ));  
        }
        formatted_rupee = explore_remaining_units+last_three_digits;
    } else {
        formatted_rupee = rupee;
    }
    return formatted_rupee; 
}

そして、PHPで:

function indianCurrencyNumberFormat($rupee) {
    $explore_remaining_units = "";
    if (strlen($rupee) > 3) {
        $last_three_digits = substr($rupee, strlen($rupee) - 3, strlen($rupee));
        $remaining_units = substr($rupee, 0, strlen($rupee) - 3); 
        $remaining_units = (strlen($remaining_units) % 2 == 1) ? "0".$remaining_units : $remaining_units; 
        $split_rupee = str_split($remaining_units, 2);
        for ($i = 0; $i < sizeof($split_rupee); $i++) {
          $explore_remaining_units .= (($i == 0) ? ( (int) $split_rupee[$i] . "," ) : ( $split_rupee[$i] . "," ));  
        }
        $formatted_rupee = $explore_remaining_units.$last_three_digits;
    } else {
        $formatted_rupee = $rupee;
    }
    return $formatted_rupee; 
}

詳細を見ることができます こちら

0
user3693466
import Java.util.*;

public class string1 {

     public static void main(String args[])
     {
         int i,j;
         boolean op=false;

         StringBuffer sbuffer = new StringBuffer();
         Scanner input = new Scanner(System.in);
         System.out.println("Enter a string");
         sbuffer.append(input.nextLine());

         int length=sbuffer.length();
         if(sbuffer.length()<3)
         {
             System.out.println("string="+sbuffer);
         }
         else
         {
             for ( i = sbuffer.length(); i >0; i--) 
             {

                 if (i==length-3)
                 {
                     sbuffer.insert(i, ",");
                      op=true;
                 }
                 while(i>1 && op==true)
                 {
                     i=i-2;

                     if(i>=1)
                     {

                     sbuffer.insert(i, ",");
                     }
                 }
             }

         }
         System.out.println("string="+sbuffer);
     }
}
0
Amit gupta

これは、コードで単一のロケールを手動で指定する代わりに、より適切な答えであり、動的に機能します。

_public String convertToDefaultCurrencyFormat(String amountToConvert){
    NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.getDefault());
    String moneyString = formatter.format(Double.valueOf(amountToConvert));
    return moneyString;
}   
_

インドルピーの形式の変更Androidデバイスの言語:

_Setting > Language & Input Settings >_ English(India)を選択

出力:

_₹10,00,000 (Starting with Indian Rupee symbol)
_