我正在编写一个代码,用户可以选择一种货币,程序会将欧元金额转换为所选货币。我遇到的唯一两个问题是,首先,我希望计算在用户按 Enter 键后进行,其次,我希望结果具有以下格式“1234,56”,换句话说,而不是使用分隔小数点的典型句点,我希望它是逗号。
这是我到目前为止所做的。 (这可行,但缺少上面提到的两件事)
PS:转化率已经给我了,不是我选的。
private void onAction(ActionEvent event) {
do{
try{
double conversor = 0;
String euros = ValorEuros.getText();
double cantEuros =
Double.parseDouble(euros.replace(',','.'));
if(!ValorEuros.getText().equals("") &&
(Libra.isSelected() || Dolar_americano.isSelected()
|| Rupia_india.isSelected() ||
Yuan_chino.isSelected())){
if(Libra.isSelected()){
conversor = cantEuros * 0.88;
}
else if(Dolar_americano.isSelected()){
conversor = cantEuros * 1.19;
}
else if(Rupia_india.isSelected()){
conversor = cantEuros * 80.22;
}
else{
conversor = cantEuros * 7.5;
}
}
DecimalFormat df = new DecimalFormat("#.###");
String redondeado = df.format(conversor);
ResultadoConversion.setText(redondeado);
} catch(NumberFormatException e){ResultadoConversion.setText("Error en formato de número");}
}while(isSelected(event));
}
@FXML
private boolean isSelected(ActionEvent event) {
return event.isConsumed();
}
@FXML
private boolean onKeyPressed(KeyEvent event) {
return event.getCode() == KeyCode.ENTER;
}
我假设您的输入是
TextField
。如果是这种情况,那么您所需要做的就是设置字段的 onAction
处理程序。
someTextField.setOnAction(e -> {
// do something...
});
在所有平台上,当用户在文本字段获得焦点时按下 Enter 时,将调用此处理程序。
DecimalFormatSymbols
自定义格式的某些部分使用的字符。例如以下内容:
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
var symbols = new DecimalFormatSymbols(Locale.ROOT);
symbols.setDecimalSeparator(',');
var formatter = new DecimalFormat("0.00", symbols);
System.out.println(formatter.format(1234.56));
System.out.println(formatter.format(5.3));
System.out.println(formatter.format(117));
System.out.println(formatter.format(0.42));
}
}
输出:
1234,56
5,30
117,00
0,42
如果您只想为小数点分隔符设置
,
并使用相对简单的模式,那么上面的代码应该可以正常工作。但这种方法对用户不太友好,除非您知道每个预期用户都会同意将 ,
视为货币值的小数分隔符。理想情况下,您应该考虑用户的区域设置和/或者,如果实现的努力值得的话,允许用户在应用程序中选择区域设置。
格式化货币时,通常应在用户的区域设置中对其进行格式化,无论格式化的货币类型如何。在输出中包含货币的本地化符号可能是个好主意。这两件事都有助于防止用户感到困惑。
您可以通过
DecimalFormat
直接使用适当的模式来实现此目的,但没有理由重新发明轮子。您可以使用 NumberFormat#getCurrencyInstance(Locale)
获取给定区域设置的货币格式化程序。一旦有了格式化程序,您就可以在其上设置适当的 Currency
。例如:
import java.text.NumberFormat;
import java.util.Currency;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
var currency = Currency.getInstance("USD");
test(currency, Locale.US);
test(currency, Locale.FRANCE);
}
static void test(Currency currency, Locale locale) {
var formatter = NumberFormat.getCurrencyInstance(locale);
formatter.setCurrency(currency);
System.out.printf(
"[Currency = %s, Locale = %s]: %s%n", currency, locale, formatter.format(1234.56));
}
}
输出:
[Currency = USD, Locale = en_US]: $1,234.56
[Currency = USD, Locale = fr_FR]: 1 234,56 $US
请注意相同货币在两个区域设置之间的格式有何不同。