@@ -188,8 +188,40 @@ export class Converter {
188188 return Math . max ( input , max ) ;
189189 }
190190
191- static FormatPattern ( value : string , pattern : string ) {
192- //TODO...
193- return value ;
194- }
195- }
191+ static FormatPattern ( value : unknown , pattern : string ) {
192+ const numberValue = Number ( value ) ;
193+ if ( Number . isNaN ( numberValue ) )
194+ return String ( value ?? "" ) ;
195+
196+ const formatMatch = / [ 0 # , . ] + / . exec ( pattern ) ;
197+ if ( formatMatch == null )
198+ return String ( value ?? "" ) ;
199+
200+ const format = formatMatch [ 0 ] ;
201+ const decimalIndex = format . indexOf ( "." ) ;
202+ const integerPattern = decimalIndex === - 1 ? format : format . substring ( 0 , decimalIndex ) ;
203+ const fractionPattern = decimalIndex === - 1 ? "" : format . substring ( decimalIndex + 1 ) ;
204+ const useThousandsSeparator = integerPattern . includes ( "," ) ;
205+ const integerDigits = integerPattern . replace ( / , / g, "" ) ;
206+ const minimumIntegerDigits = [ ...integerDigits ] . filter ( x => x === "0" ) . length ;
207+ const maximumFractionDigits = fractionPattern . length ;
208+ const minimumFractionDigits = [ ...fractionPattern ] . filter ( x => x === "0" ) . length ;
209+
210+ const fixedValue = Math . abs ( numberValue ) . toFixed ( maximumFractionDigits ) ;
211+ let [ integerPart , fractionPart = "" ] = fixedValue . split ( "." ) ;
212+ integerPart = integerPart . padStart ( minimumIntegerDigits , "0" ) ;
213+
214+ if ( useThousandsSeparator )
215+ integerPart = integerPart . replace ( / \B (? = ( \d { 3 } ) + (? ! \d ) ) / g, "," ) ;
216+
217+ if ( fractionPart . length > minimumFractionDigits )
218+ fractionPart = fractionPart . replace ( / 0 + $ / g, "" ) ;
219+
220+ while ( fractionPart . length < minimumFractionDigits )
221+ fractionPart += "0" ;
222+
223+ const sign = numberValue < 0 ? "-" : "" ;
224+ const formattedValue = sign + integerPart + ( fractionPart ? "." + fractionPart : "" ) ;
225+ return pattern . substring ( 0 , formatMatch . index ) + formattedValue + pattern . substring ( formatMatch . index + format . length ) ;
226+ }
227+ }
0 commit comments