- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望能够使用 NumberFormat('###,##0.00', 'en_US')
显示在 TextFormField 中输入的值.
转换没有问题,但我在显示 formattedPrice
的值时遇到问题在 TextFormField 中。我还想将 TextFormField 的默认值设置为 '0.00'
.在我下面的示例代码中,TextFormField 将输入限制为只有一个十进制符号/分隔符和两个十进制值。
我对 .00
没问题在输入期间 TextFormField 值中没有小数时不显示小数,但我希望在输入值时放置两位小数格式。
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _subscriptionFormKey = GlobalKey<FormState>();
final _subscriptionPriceController = TextEditingController();
NumberFormat numFormat = NumberFormat('###,###.00', 'en_US');
NumberFormat numSanitizedFormat = NumberFormat('en_US');
var currency = 'USD';
void _validate() {
if (_subscriptionFormKey.currentState!.validate()) {}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Form(
key: _subscriptionFormKey,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
autofocus: true,
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d{0,2}')),
],
keyboardType: TextInputType.numberWithOptions(decimal: true),
validator: (cost) {
if (cost == null || cost.isEmpty) {
return 'Empty';
}
return null;
},
textInputAction: TextInputAction.next,
/// TODO TextFormField default value
/// I'd like to be to set '0.00' value by default
controller: _subscriptionPriceController,
decoration: InputDecoration(
hintText: 'Price',
prefixText:
NumberFormat.simpleCurrency(name: currency).currencySymbol,
),
onChanged: (price) {
/// TODO Display [formattedPrice] in TextFormField
var formattedPrice = numFormat.format(double.parse(price));
debugPrint('Formatted $formattedPrice');
var numSanitized = numSanitizedFormat.parse(price);
debugPrint('Sanitized: $numSanitized');
_subscriptionPriceController.value = TextEditingValue(
text: price,
selection: TextSelection.collapsed(offset: price.length),
);
},
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: _validate,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
感谢@Andrej 建议使用 onFieldSubmitted()
而不是 onChange()
.我已经使用包含的修复程序更新了我的代码。我希望这能帮助其他遇到类似问题的开发者。
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:intl/intl.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key? key, required this.title}) : super(key: key);
final String title;
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
final _subscriptionFormKey = GlobalKey<FormState>();
final _subscriptionPriceController = TextEditingController();
final NumberFormat numFormat = NumberFormat('###,##0.00', 'en_US');
final NumberFormat numSanitizedFormat = NumberFormat('en_US');
var currency = 'USD';
var defaultPrice = '0.00';
void _validate() {
if (_subscriptionFormKey.currentState!.validate()) {}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Form(
key: _subscriptionFormKey,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: TextFormField(
autofocus: true,
inputFormatters: [
FilteringTextInputFormatter.allow(RegExp(r'^\d+\.?\d{0,2}')),
],
keyboardType: TextInputType.numberWithOptions(decimal: true),
validator: (cost) {
if (cost == null || cost.isEmpty) {
return 'Empty';
}
return null;
},
textInputAction: TextInputAction.next,
/// Set TextFormField default value
controller: _subscriptionPriceController..text = defaultPrice,
decoration: InputDecoration(
hintText: 'Price',
prefixText:
NumberFormat.simpleCurrency(name: currency).currencySymbol,
),
onTap: () {
var textFieldNum = _subscriptionPriceController.value.text;
var numSanitized = numSanitizedFormat.parse(textFieldNum);
_subscriptionPriceController.value = TextEditingValue(
/// Clear if TextFormField value is 0
text: numSanitized == 0 ? '' : '$numSanitized',
selection:
TextSelection.collapsed(offset: '$numSanitized'.length),
);
},
onFieldSubmitted: (price) {
/// Set value to 0 if TextFormField value is empty
if (price == '') price = '0';
final formattedPrice = numFormat.format(double.parse(price));
debugPrint('Formatted $formattedPrice');
_subscriptionPriceController.value = TextEditingValue(
text: formattedPrice,
selection:
TextSelection.collapsed(offset: formattedPrice.length),
);
},
),
),
),
floatingActionButton: FloatingActionButton(
onPressed: _validate,
tooltip: 'Increment',
child: Icon(Icons.add),
),
);
}
}
最佳答案
如果我没理解错的话,您希望在输入文本字段时对价格进行格式化。
如果是,只需将此代码添加到您的TextFormField
:
onFieldSubmitted: (price) {
final formattedPrice = numFormat.format(double.parse(price));
debugPrint('Formatted $formattedPrice');
_subscriptionPriceController.value = TextEditingValue(
text: formattedPrice,
selection:
TextSelection.collapsed(offset: formattedPrice.length),
);
},
将初始值添加到文本字段:
final _subscriptionPriceController = TextEditingController(text: '0.00');
关于带有 NumberFormat 的 Flutter TextFormField 显示值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68740586/
以下有什么区别 NumberFormat nf = NumberFormat.getInstance(); 和 NumberFormat nf = new NumberFormat() 为什么我们需要
我在使用 Java 格式化货币时遇到问题。我正在尝试格式化要打印为货币的数字,所有小数点都对齐: £ 1.23 £ 12.34 £123.45 调用 NumberFormat.getCurrency
我有以下 vba 代码,但我想将其粘贴为 dd-mm-yyyy 格式。 Worksheets("stack").Range("M" & LastRowM + 1 & ":" & Cells(LastR
NumberFormat是否可以显示: 如果 double 值为15.00则为'15' 如果 double 值为15.50则为'15 .50' 谢谢你的帮助。 最佳答案 实际上,我认为使用 trunc
我在我的应用程序中发现了一个错误,当我使用国际格式时,我的货币字符串没有显示正确的分组和小数点分隔符。我提取了代码以尝试隔离和演示问题。在下面的代码中,我创建了一个美国格式器和一个世界格式器。它们都使
为了使NumberFormat操作具有线程安全性,我使用了ThreadLocal,如下所示: public class ThreadSafeNumberFormatter { private
例如: NumberFormat nf = NumberFormat.newInstace(); Number number = nf.parse("0.0"); number 在运行时被解析为 ja
是否可以使用 Excel 或 VBA 在单元格/列中设置数字格式,以便: 如果我输入一个公式(任何以 = 开头的内容),Excel 将计算公式(而不是将其解释为文本) 如果我输入一个值,例如 5.80
我正在尝试将字符串值格式化为有效的货币 double ,如下所示 NumberFormat currency=NumberFormat.getCurrencyInstance(); currency.
我想格式化一个没有任何前缀(或相同前缀)的正数和负数的数字。 NumberFormat 规范规定您可以为正数指定一个子模式,为负数指定一个子模式,并用分号分隔。 Each subpattern has
尝试在 JSP 中显示货币符号,但我没有看到它。我做了研究,但我只是不知道我还应该添加什么才能让它发挥作用。这就是我所拥有的。 Controller @NumberFormat(style = St
我正在尝试将以下字符串解析为字节。但是它给了我 NumberFormat 异常。有人可以告诉我解决方案是什么吗? Byte.parseByte("111111111111111111111111100
我正在尝试用 Java 制作一份快速报告,但在格式化数字时遇到问题。这是我现在拥有的: MessageFormat lineFormat = new MessageFormat("{0}\t{1,nu
这个问题已经有答案了: How to format decimals in a currency format? (22 个回答) 已关闭 7 年前。 我像这样使用 Java NumberFormat
我有以下类(class): import java.text.NumberFormat; public static class NF { public static NumberFormat
我有一个由用户输入的金额,我想验证它。我已经编写了一个 JSF validator ,但在所有情况下都无法让它正常工作。这是我的场景: 我有不同区域设置的用户,因此我需要处理各种输入方法,并希望允许以
我正在尝试检查用户是否以有效格式输入了数字。但似乎无效的字符串也被成功解析。一个例子: final String value1 = "12,85", value2 = "128,598.77"; Nu
有没有办法创建一个没有最大小数位数的 NumberFormat 实例?一个明显的解决方案是 NumberFormat format = NumberFormat.getNumberInstance()
代码: let currency = 400023; console.log(new Intl.NumberFormat('de-DE', { style: 'currency', curre
我无法更改现有 Excel 文档 (xlsx) 中的列格式。列内容实际上是数字,但显示为文本,因此出现绿色三角形告诉单元格显示为文本。 所以我在 C# 应用程序中打开此文档并执行以下操作: sheet
我是一名优秀的程序员,十分优秀!