Отображение валюты в индийском формате нумерации
У меня вопрос о форматировании валюты рупии (Indian Rupee - 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
Обратитесь Индийская система нумерации
Разделители после двух цифр, за исключением последнего набора, который находится в тысячах.
Я искал в Интернете, и люди попросили использовать локаль en_GB
или шаблон #,##,##,##,##0.00
Я пробовал это на JSTL, используя следующий тег:
<fmt:formatNumber value="${product.price}" type="currency"
pattern="#,##,##,##,###.00"/>
Но это, похоже, не решает проблему. Любая помощь в этом вопросе будет с благодарностью.
Спасибо
Ответы
Ответ 1
К сожалению DecimalFormat
не поддерживает группы переменной ширины. Поэтому он никогда не будет форматировать значения точно так, как вы хотите:
Если вы поставляете шаблон с несколькими символами группировки, используется интервал между последним и концом целого числа. Итак "#,##,###,####" == "######,####" == "##,####,####"
.
Большинство механизмов форматирования чисел в Java основаны на этом классе и поэтому наследуют этот недостаток.
ICU4J (версия Java Международные компоненты для Юникода) предоставляет NumberFormat
, который поддерживает :
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
не расширяет класс java.text.NumberFormat
(поскольку он уже расширяет Внутренний базовый класс ICU), он делает, однако расширяет класс java.text.Format
, который имеет format(Object)
.
Ответ 2
С Android это сработало для меня:
new DecimalFormat("##,##,##0").format(amount);
450500 отформатирован как 4,50,500
http://developer.android.com/reference/java/text/DecimalFormat.html - DecimalFormat поддерживает два размера группировки - основной размер группировки, а другой - для всех остальных.
Ответ 3
здесь простая вещь, которую вы можете сделать,
float amount = 100000;
NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));
String moneyString = formatter.format(amount);
System.out.println(moneyString);
Выход будет Rs.100,000.00.
Ответ 4
Я тоже попал в ту же проблему.
Я работал с 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);
}
Он предоставит формат, такой как индийская система нумерации.
Если вы хотите десятичные точки, просто добавьте ".##"
в оба условия.
"###"
до "###.##"
и "000"
до "000.##"
.
Ответ 5
Простое решение -
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);
Ответ 6
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.
Ответ 7
![enter image description here]()
Просто скопируйте эту функцию.:)
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);
}
Ответ 8
Если локальный каталог по умолчанию недоступен, и пользователь не вносит никаких изменений в локаль, мы можем пойти с настройкой символа валюты, используя уникод и десятичное форматирование. Как и в приведенном ниже коде:
Например, Установка символа индийской валюты и форматирование значения. Это будет работать без внесения пользователем изменений в настройки.
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
Ответ 9
//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);
Ответ 10
версия 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)
}
Ответ 11
Методы по умолчанию в существующих библиотеках могут отображать только тысячи seperator. поэтому для этого нам нужно написать специальную функцию. Вы можете использовать несколько операций подстроки, чтобы получить желаемый результат.
В 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;
}
Вы можете увидеть более подробную информацию здесь.
Ответ 12
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);
}
}
Ответ 13
Лучше ответить и работает динамически, вместо того, чтобы вручную указывать один локальный код.
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)
Ответ 14
В 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();
}
Ответ 15
ALTER FUNCTION [dbo]. [Udf_CurrencyFormat] (@UC varchar (50)) RETURNS varchar (50) AS BEGIN объявляет @FC varchar (50), @Масштаб varchar (3), @i bigint = 1, @a int = 3, @b int = 2, @WhileLength bigint, @UCScale varchar (50), @Con varchar (20) set @Scale = charindex ('.', @UC) --if имеет номер. затем значение else '0', если (@Scale! = '0') begin set @UCScale = @UC set @Con = substring (@UCScale, charindex ('.', @UCScale), 3) set @UC = подстрока ( @UC, 0, charindex ('.', @UC)) - конец подстроки if (cast (len (@UC) как bigint)% 2! = 0) --if нечетное начало set @WhileLength = (cast (len (@UC) как bigint) -3)/2 while (@i <= @WhileLength) - длина -3/2 = 3, если длина равна 9 (cast (len (@UC) как bigint) -3 )/2 begin set @a = 3 * @i set @UC = stuff (@UC, @a, 0, ',') set @i = @i +1 end --while set @FC = @UC end --if odd Scale '0' else if (cast (len (@UC) as bigint)% 2 = 0) --if даже начать задавать @WhileLength = (((cast (len (@UC) как bigint) [CN07 ]) -3)/2) +1 while (@i <= @WhileLength) begin if (@i = 1) begin set @UC = stuff (@UC, @b, 0, ',') end else begin set @b = @b + 3 set @UC = stuff (@UC, @b, 0, ',') end set @i = @i +1 end set @FC = @UC end if (@Scale! = '0') begin set @FC = @FC+ @Con end --if (@Scale! = '0') --set @FC = @UC return @FC END