ルピー通貨のフォーマットについて質問があります(インドルピー-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"/>
しかし、これは問題を解決しないようです。この問題の助けは大歓迎です。
ありがとう
残念ながら DecimalFormat
は可変幅グループをサポートしていません。そのため、あなたが望むように値を正確にフォーマットすることはありません:
複数のグループ化文字を含むパターンを指定する場合、最後の文字と整数の最後の間隔が使用されます。だから_
"#,##,###,####" == "######,####" == "##,####,####"
_。
Javaのほとんどの数値書式メカニズムはそのクラスに基づいているため、この欠陥を継承しています。
ICU4J(Javaバージョンの International Components for Unicode )は、 NumberFormat
doesがこのフォーマットをサポートするクラス:
_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)
メソッドを持つクラス。
Androidでは、これは私のために働いた:
new DecimalFormat("##,##,##0").format(amount);
450500は4,50,500としてフォーマットされます
http://developer.Android.com/reference/Java/text/DecimalFormat.html -DecimalFormatは、2つのグループ化サイズをサポートしています。1つはプライマリグループ化サイズで、もう1つは他のすべてに使用されます。
ここにあなたができる簡単なこと、
float amount = 100000;
NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));
String moneyString = formatter.format(amount);
System.out.println(moneyString);
出力はRs.100,000.00になります。
私も同じ問題に陥りました。私は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.##"
。
簡単な解決策は-
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);
使用可能なデフォルトのロケールがなく、ユーザーがロケールに変更を加えない場合、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
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になります。
[$ = 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);
}
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)
}
//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);
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();
}
既存のライブラリのデフォルトのメソッドは、数千のセパレーターのみを表示できます。そのため、このためのカスタム関数を作成する必要があります。複数の部分文字列操作を使用して、目的の結果を得ることができます。
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;
}
詳細を見ることができます こちら 。
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);
}
}
これは、コードで単一のロケールを手動で指定する代わりに、より適切な答えであり、動的に機能します。
_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)
_