diff --git a/lib/src/base_spin_box.dart b/lib/src/base_spin_box.dart index fd986d6..c750587 100644 --- a/lib/src/base_spin_box.dart +++ b/lib/src/base_spin_box.dart @@ -44,6 +44,7 @@ abstract class BaseSpinBox extends StatefulWidget { VoidCallback? get afterChange; bool get readOnly; FocusNode? get focusNode; + String get decimalSeparator; } mixin SpinBoxMixin on State { @@ -57,11 +58,11 @@ mixin SpinBoxMixin on State { FocusNode get focusNode => _focusNode; TextEditingController get controller => _controller; SpinFormatter get formatter => SpinFormatter( - min: widget.min, max: widget.max, decimals: widget.decimals); + min: widget.min, max: widget.max, decimals: widget.decimals, decimalSeparator: widget.decimalSeparator); - static double _parseValue(String text) => double.tryParse(text) ?? 0; + double _parseValue(String text) => double.tryParse(text.replaceAll(widget.decimalSeparator, '.')) ?? 0; String _formatText(double value) { - return value.toStringAsFixed(widget.decimals).padLeft(widget.digits, '0'); + return value.toStringAsFixed(widget.decimals).padLeft(widget.digits, '0').replaceAll('.', widget.decimalSeparator); } Map get bindings { diff --git a/lib/src/cupertino/spin_box.dart b/lib/src/cupertino/spin_box.dart index 5acdbd4..6330694 100644 --- a/lib/src/cupertino/spin_box.dart +++ b/lib/src/cupertino/spin_box.dart @@ -85,6 +85,7 @@ class CupertinoSpinBox extends BaseSpinBox { this.beforeChange, this.afterChange, this.focusNode, + this.decimalSeparator = ".", }) : assert(min <= max), keyboardType = keyboardType ?? TextInputType.numberWithOptions( @@ -213,6 +214,12 @@ class CupertinoSpinBox extends BaseSpinBox { @override final VoidCallback? afterChange; + /// The decimal separator used for formatting the value. + /// + /// Defaults to `.`. + @override + final String decimalSeparator; + /// See [CupertinoTextField.enabled]. final bool enabled; diff --git a/lib/src/material/spin_box.dart b/lib/src/material/spin_box.dart index 5758c5d..ac81ae7 100644 --- a/lib/src/material/spin_box.dart +++ b/lib/src/material/spin_box.dart @@ -87,6 +87,7 @@ class SpinBox extends BaseSpinBox { this.beforeChange, this.afterChange, this.focusNode, + this.decimalSeparator = ".", }) : assert(min <= max), keyboardType = keyboardType ?? TextInputType.numberWithOptions( @@ -218,6 +219,12 @@ class SpinBox extends BaseSpinBox { @override final VoidCallback? afterChange; + /// The decimal separator used for formatting the value. + /// + /// Defaults to `.`. + @override + final String decimalSeparator; + /// See [TextField.enabled]. final bool enabled; diff --git a/lib/src/spin_formatter.dart b/lib/src/spin_formatter.dart index 1806e6f..6b83adb 100644 --- a/lib/src/spin_formatter.dart +++ b/lib/src/spin_formatter.dart @@ -25,16 +25,17 @@ import 'package:flutter/services.dart'; // ignore_for_file: public_member_api_docs class SpinFormatter extends TextInputFormatter { - SpinFormatter({required this.min, required this.max, required this.decimals}); + SpinFormatter({required this.min, required this.max, required this.decimals, required this.decimalSeparator}); final double min; final double max; final int decimals; + final String decimalSeparator; @override TextEditingValue formatEditUpdate( TextEditingValue oldValue, TextEditingValue newValue) { - final input = newValue.text; + final input = newValue.text.replaceAll(decimalSeparator, '.'); if (input.isEmpty) { return newValue; }