我有关于格式化卢比货币(印度卢比 - 印度卢比)的问题。
通常会将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"/>
但这似乎并没有解决问题。任何有关此事的帮助将不胜感激。
由于
答案 0 :(得分:57)
不幸的是DecimalFormat
不支持变宽组。因此,它不会完全按照您的要求格式化值:
如果提供具有多个分组字符的模式,则最后一个和整数结尾之间的间隔是使用的间隔。所以
"#,##,###,####" == "######,####" == "##,####,####"
。
Java中的大多数数字格式化机制都基于该类,因此继承了这个缺陷。
ICU4J(International Components for Unicode的Java版本)提供了{strong>支持此格式的<{3}}类:
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
类不扩展NumberFormat
类(因为它已经扩展了ICU内部基类),确实但是扩展java.text.NumberFormat
类,它具有java.text.Format
方法。
答案 1 :(得分:20)
使用Android,这对我有用:
new DecimalFormat("##,##,##0").format(amount);
450500格式化为4,50,500
http://developer.android.com/reference/java/text/DecimalFormat.html - DecimalFormat支持两种分组大小 - 主要分组大小,以及一种用于所有其他分组大小。
答案 2 :(得分:9)
这是你能做的简单事情,
float amount = 100000;
NumberFormat formatter = NumberFormat.getCurrencyInstance(new Locale("en", "IN"));
String moneyString = formatter.format(amount);
System.out.println(moneyString);
输出将为Rs.100,000.00。
答案 3 :(得分:5)
我也遇到了同样的问题。
我正在使用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.##"
。
答案 4 :(得分:4)
简单的解决方案是 -
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);
答案 5 :(得分: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。
答案 6 :(得分:2)
只需复制过去的这个功能。 :)
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);
}
答案 7 :(得分:2)
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)
}
答案 8 :(得分:2)
如果没有可用的默认区域设置且用户未对区域设置进行任何更改,我们可以使用unicode和decimal格式设置货币符号。如下面的代码所示:
例如设置印度货币符号并格式化值。这将在没有用户更改设置的情况下工作。
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 :(得分:1)
尝试一下:
NumberFormat.getCurrencyInstance(new Locale("en","IN")).format(number)
“ en”是英语的。 “ IN”代表该国家(印度)。
答案 10 :(得分:1)
//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);
答案 11 :(得分:0)
更好的答案和动态工作,而不是手动在代码中指定单个Locale。
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)
答案 12 :(得分:0)
在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();
}
答案 13 :(得分:0)
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);
}
}
答案 14 :(得分:0)
我探索的几个选项如下
...
@EventListener(ApplicationReadyEvent.class)
public void doSomethingAfterStartup() throws UnknownHostException {
System.setSecurityManager(new SecurityManagerImpl());
}
...
最后一个需要重新获得以下依赖关系
import java.text.NumberFormat;
import java.util.Locale;
class NumberFormatDemo {
public static void main(String[] args) {
Double d = 45124853123456.78941;
NumberFormat nf = NumberFormat.getInstance(Locale.ITALY);
System.out.println("ITALY representation of " + d + " : " + nf.format(d));
nf = NumberFormat.getInstance(Locale.GERMANY);
System.out.println("GERMANY representation of " + d + " : " + nf.format(d));
nf = NumberFormat.getInstance(Locale.CHINESE);
System.out.println("CHINESE representation of " + d + " : " + nf.format(d));
nf = NumberFormat.getInstance(Locale.US);
System.out.println("US representation of " + d + " : " + nf.format(d));
nf = NumberFormat.getInstance(Locale.ENGLISH);
System.out.println("ENGLISH representation of " + d + " : " + nf.format(d));
nf = NumberFormat.getInstance(Locale.UK);
System.out.println("UK representation of " + d + " : " + nf.format(d));
//===================================================
//ICU4j example
com.ibm.icu.text.NumberFormat format = com.ibm.icu.text.NumberFormat.getCurrencyInstance(new Locale("en", "in"));
System.out.println("INDIA representation of " + d + " : " + nf.format(d));
}
}
答案 15 :(得分:0)
public static String paiseToString(long paise)
{
DecimalFormat fmt = new DecimalFormat("#0.00");
boolean minus = paise < 0;
StringBuilder sb = new StringBuilder(fmt.format(Math.abs(paise)/100.0));
for (int index = sb.length()-6; index > 0; index-=2)
{
sb.insert(index,',');
}
if (minus)
sb.insert(0,'-');
return sb.toString();
}
public static String rupeesToString(long rupees)
{
boolean minus = rupees < 0;
StringBuilder sb = new StringBuilder(Long.toString(Math.abs(rupees)));
for (int index = sb.length()-3; index > 0; index-=2)
{
sb.insert(index,',');
}
if (minus)
sb.insert(0,'-');
return sb.toString();
}
// Test the functions
public static void main(String[] args)
{
// Test for positive values
long val = 1;
while (val < Long.MAX_VALUE/10)
{
System.out.printf("%28s %28s\n",paiseToString(val),rupeesToString(val));
val *= 10;
}
// Test for negative values
val = -1;
while (val > Long.MIN_VALUE/10)
{
System.out.printf("%28s %28s\n",paiseToString(val),rupeesToString(val));
val *= 10;
}
}
答案 16 :(得分:0)
在Android上对我来说正常工作
public static String priceFormatWithDec(String price) {
DecimalFormat decimalFormat = new DecimalFormat("#,##,###.00");
String format = decimalFormat.format(Double.parseDouble(price));
return String.format("%s", format);
}
答案 17 :(得分:0)
使用Locale类和getCurrencyInstance,可以获取印度货币格式。
在为印度定义新的语言环境时,对英语使用“ en”,对印地语使用“ hi”。
有关语言环境,请参考https://docs.oracle.com/javase/8/docs/api/java/util/Locale.html
有关getCurrencyInstance的信息,请参见https://docs.oracle.com/javase/8/docs/api/java/text/NumberFormat.html#getCurrencyInstance--
这是一个小实现。
.delete_many()
}
答案 18 :(得分:0)
这对我有用..
public String indianCurrencyFormat(String s) {
String orignalNo = s;
String formatted = "";
if(orignalNo.startsWith("-")) {
s = s.replace("-","");
}
if(orignalNo.contains(".")) {
if(s.length() > 6){
StringBuilder sb=new StringBuilder(s);
s = sb.reverse().toString();
formatted = s.substring(0,6);
s = s.substring(6);
while(s.length() > 1) {
formatted += "," + s.substring(0,2);
s = s.substring(2);
}
sb = new StringBuilder(formatted+(StringUtils.isNotBlank(s) ? ","+s :""));
formatted = sb.reverse().toString();
} else {
formatted = s;
}
} else {
if(s.length() > 3){
StringBuilder sb=new StringBuilder(s);
s = sb.reverse().toString();
formatted = s.substring(0,3);
s = s.substring(3);
while(s.length() > 1) {
formatted += "," + s.substring(0,2);
s = s.substring(2);
}
sb = new StringBuilder(formatted+(StringUtils.isNotBlank(s) ? ","+s :""));
formatted = sb.reverse().toString();
} else {
formatted = s;
}
}
if (orignalNo.startsWith("-")){
formatted = "-"+formatted;
}
return formatted;
}
答案 19 :(得分:0)
现有库中的默认方法只能显示数千个分隔符。所以我们需要为此编写自定义函数。您可以使用多个子字符串操作来获得所需的结果。
在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;
}
您可以查看更多详情here。
答案 20 :(得分:-1)
fun currencyFormatter(inputNumbers: String?): String {
var formattedNumber = ""
var decimalPoint=""
var inputNumber=""
if (inputNumbers != null) {
try {
val sp=inputNumbers.split(".")
inputNumber=sp[0]
decimalPoint=sp[1]
} catch (e: Exception) {
inputNumber=inputNumbers
}
formattedNumber = when {
inputNumber.length <= 3 -> {
inputNumber
}
inputNumber.length <= 5 -> {
String.format("%s,%s", inputNumber.substring(0, inputNumber.length - 3),
inputNumber.substring(inputNumber.length - 3))
}
inputNumber.length <= 7 -> {
String.format("%s,%s,%s",
inputNumber.substring(0, inputNumber.length - 5),
inputNumber.substring(inputNumber.length - 5, inputNumber.length - 3),
inputNumber.substring(inputNumber.length - 3)
)
}
inputNumber.length <= 9 -> {
String.format("%s,%s,%s,%s",
inputNumber.substring(0, inputNumber.length - 7),
inputNumber.substring(inputNumber.length - 7, inputNumber.length - 5),
inputNumber.substring(inputNumber.length - 5, inputNumber.length - 3),
inputNumber.substring(inputNumber.length - 3)
)
}
else -> inputNumber
}
}
return "$formattedNumber.$decimalPoint"
}
main(){
val rs=1200.55f
print(currencyFormatter(rs.toString()))
}
答案 21 :(得分:-3)
ALTER FUNCTION [dbo]。[udf_CurrencyFormat](@ UC varchar(50))RETURNS varchar(50)AS BEGIN声明@FC varchar(50),@ Scale varchar(3),@ i bigint = 1,@ a int = 3,@ b int = 2,@ WhileLength bigint,@ UCScale varchar(50), @Con varchar(20)设置@ Scale = charindex('。',@ UC) - 如果数字有'。' 然后将值设为'0'如果(@Scale!='0')开始设置@ UCScale = @ UC set @ Con = substring(@ UCScale,charindex('。',@ UCScale),3)set @ UC = substring(@ UC,0,charindex('。',@ UC)) - substring end if(cast(len(@UC)as bigint)%2!= 0) - 如果奇数开始设置 @ WhileLength =(cast(len(@UC)as bigint)-3)/ 2 while(@ i&lt; = @ WhileLength) - length = 3/2 = 3如果长度为9(强制转换(len(@UC)为bigint)-3)/ 2开始设置 @ a = 3 * @我设置@UC = stuff(@ UC,@ a,0,',')设置@ i = @ i + 1 end - while set @ FC = @ UC end --if odd Scale'0'否则if(cast(len(@UC)as bigint)%2 = 0) - 如果开始设置@WhileLength =(((cast(len(@UC)as bigint)-1)-3)/ 2)+1 while(@ i&lt; = @ WhileLength)start if(@ i = 1)开始设定 @ UC = stuff(@ UC,@ b,0,',')end else begin set @ b = @ b + 3 set @ UC = stuff(@ UC,@ b,0,',')结束集@ i = @ i + 1结束集@ FC = @ UC结束 if(@Scale!='0')开始设置@ FC = @ FC + @ Con end --if(@Scale!='0') - 设置 @ FC = @ UC返回@FC END