@@ -68,6 +68,14 @@ const makeVNumberInputProps = propsFactory({
68
68
type : String ,
69
69
validator : ( v : any ) => ! v || v . length === 1 ,
70
70
} ,
71
+ grouping : {
72
+ type : [ Boolean , String ] as PropType < 'always' | 'auto' | 'min2' | boolean > ,
73
+ default : false ,
74
+ } ,
75
+ groupSeparator : {
76
+ type : String ,
77
+ validator : ( v : any ) => ! v || v . length === 1 ,
78
+ } ,
71
79
72
80
...omit ( makeVTextFieldProps ( ) , [ 'modelValue' , 'validationValue' ] ) ,
73
81
} , 'VNumberInput' )
@@ -95,32 +103,23 @@ export const VNumberInput = genericComponent<VNumberInputSlots>()({
95
103
96
104
const isFocused = shallowRef ( props . focused )
97
105
98
- const { decimalSeparator : decimalSeparatorFromLocale } = useLocale ( )
106
+ const {
107
+ current : locale ,
108
+ decimalSeparator : decimalSeparatorFromLocale ,
109
+ numericGroupSeparator : numericGroupSeparatorFromLocale ,
110
+ } = useLocale ( )
99
111
const decimalSeparator = computed ( ( ) => props . decimalSeparator ?. [ 0 ] || decimalSeparatorFromLocale . value )
100
-
101
- function correctPrecision ( val : number , precision = props . precision , trim = true ) {
102
- const fixed = precision == null
103
- ? String ( val )
104
- : val . toFixed ( precision )
105
-
106
- if ( isFocused . value && trim ) {
107
- return Number ( fixed ) . toString ( ) // trim zeros
108
- . replace ( '.' , decimalSeparator . value )
109
- }
110
-
111
- if ( props . minFractionDigits === null || ( precision !== null && precision < props . minFractionDigits ) ) {
112
- return fixed . replace ( '.' , decimalSeparator . value )
113
- }
114
-
115
- let [ baseDigits , fractionDigits ] = fixed . split ( '.' )
116
-
117
- fractionDigits = ( fractionDigits ?? '' ) . padEnd ( props . minFractionDigits , '0' )
118
- . replace ( new RegExp ( `(?<=\\d{${ props . minFractionDigits } })0+$` , 'g' ) , '' )
119
-
120
- return [
121
- baseDigits ,
122
- fractionDigits ,
123
- ] . filter ( Boolean ) . join ( decimalSeparator . value )
112
+ const groupSeparator = computed ( ( ) => props . groupSeparator ?. [ 0 ] || numericGroupSeparatorFromLocale . value )
113
+
114
+ function correctPrecision ( val : number , precision ?: number | null , trim = true ) {
115
+ precision ??= isFocused . value && trim ? undefined : props . precision ?? undefined
116
+ return new Intl . NumberFormat ( locale . value , {
117
+ minimumFractionDigits : props . minFractionDigits ?? precision ,
118
+ maximumFractionDigits : precision ,
119
+ useGrouping : props . grouping ,
120
+ } ) . format ( val )
121
+ . replaceAll ( numericGroupSeparatorFromLocale . value , groupSeparator . value )
122
+ . replace ( decimalSeparatorFromLocale . value , decimalSeparator . value )
124
123
}
125
124
126
125
const model = useProxiedModel ( props , 'modelValue' , null ,
@@ -154,7 +153,10 @@ export const VNumberInput = genericComponent<VNumberInputSlots>()({
154
153
_inputText . value = null
155
154
return
156
155
}
157
- const parsedValue = Number ( val . replace ( decimalSeparator . value , '.' ) )
156
+ const parsedValue = Number ( val
157
+ . replaceAll ( groupSeparator . value , '' )
158
+ . replace ( decimalSeparator . value , '.' )
159
+ )
158
160
if ( ! isNaN ( parsedValue ) && parsedValue <= props . max && parsedValue >= props . min ) {
159
161
model . value = parsedValue
160
162
_inputText . value = val
@@ -315,7 +317,11 @@ export const VNumberInput = genericComponent<VNumberInputSlots>()({
315
317
if ( controlsDisabled . value ) return
316
318
if ( ! vTextFieldRef . value ) return
317
319
const actualText = vTextFieldRef . value . value
318
- const parsedValue = Number ( actualText . replace ( decimalSeparator . value , '.' ) )
320
+ const parsedValue = Number ( actualText
321
+ . replaceAll ( groupSeparator . value , '' )
322
+ . replace ( decimalSeparator . value , '.' )
323
+ )
324
+ console . log ( 'parsed value 2:' , actualText , groupSeparator . value , parsedValue )
319
325
if ( actualText && ! isNaN ( parsedValue ) ) {
320
326
inputText . value = correctPrecision ( clamp ( parsedValue , props . min , props . max ) )
321
327
} else {
0 commit comments