Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

$mol_number dot minus constraint #717

Merged
merged 16 commits into from
Nov 25, 2024
Merged
9 changes: 6 additions & 3 deletions format/format.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,11 @@ namespace $.$$ {
const mask = this.mask( filtered )

if( ( prev?.[0] ?? 0 ) >= from ) return [ from, to ]

const lastAllow = ( value.length - [ ... value ].reverse().findIndex( letter => allow.includes( letter ) ) )%(value.length+1)

const lastAllow = (
value.length - [ ... value ].reverse().findIndex( letter => allow.includes( letter ) )
) % ( value.length + 1 )

if( lastAllow < from ) {
from = to = lastAllow
}
Expand All @@ -29,7 +32,7 @@ namespace $.$$ {
++ from
++ to
}

return [ from, to ]
}

Expand Down
62 changes: 47 additions & 15 deletions number/number.view.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace $.$$ {
export class $mol_number extends $.$mol_number {

value_limited( val? : number ) : number {
if (Number.isNaN( val )) return this.value(val)
if (Number.isNaN( val )) return this.value( val )
if ( val === undefined ) return this.value()

const min = this.value_min()
Expand All @@ -27,34 +27,66 @@ namespace $.$$ {
this.value_limited( ( this.value_limited() || 0 ) + this.precision_change() )
}

value_normalized(next?: string) {
const next_num = this.value_limited( next === undefined ? next : Number(next) )

if (Number.isNaN(next_num)) return ''
round(val: number) {
if (Number.isNaN(val)) return ''
if( val === 0 ) return '0'
if( !val ) return ''

const precision_view = this.precision_view()

if( next_num === 0 ) return '0'
if( !next_num ) return ''
if (! precision_view) return val.toFixed()

if( precision_view >= 1 ) {
return ( next_num / precision_view ).toFixed()
return ( val / precision_view ).toFixed()
} else {
const fixed_number = Math.log10( 1 / precision_view )
return next_num.toFixed( Math.ceil( fixed_number ) )
return val.toFixed( Math.ceil( fixed_number ) )
}
}

@ $mol_mem
override value_string( next? : string ) {
const current = this.value_normalized()
override value_string( next? : string ): string {
// Вытягиваем value
// Если кто-то поменяет из вне value, value_string надо обновить
const current = this.round( this.value_limited() )
if (next === undefined) return current

const precision = this.precision_view()

// Точку в конце поставить нельзя, если precision_view целое число > 0
if ( precision - Math.floor(precision) === 0 ) next = next.replace(/[.,]/g, '')

// Запятые меняем на точки, удаляем не-цифры и не-точки и лишние ноли в начале целой части.
// Минус получится ввести только в начале.
next = (this.value_min() < 0 && next.startsWith('-') ? '-' : '')
+ next.replace(/,/g, '.').replace(/[^\d\.]/g, '').replace(/^0{2,}/, '0')

if ( next !== undefined) this.value_normalized( next )
let dot_pos = next.indexOf('.')

return next ?? current
if (dot_pos !== -1) {
const prev = $mol_wire_probe(() => this.value_string()) ?? ''
const dot_pos_prev = prev.indexOf('.')
// Определяем где относительно предыдущей точки юзер поставил новую
if (dot_pos_prev === dot_pos) dot_pos = next.lastIndexOf('.')

// Из частей до и после новой точки старую точку удаляем
const frac = next.slice(dot_pos + 1).replace(/\./g, '')

// Если точка идет первой, перед ней пишем 0, что бы форматирование выглядело нормально в mask
next = (next.slice(0, dot_pos) || '0').replace(/\./g, '') + '.' + frac
}

// Оставляем старое значение в value есть сочетание, приводящие к NaN, например -.
if ( Number.isNaN(Number(next)) ) return next

if ( next.endsWith('.') ) return next
if ( next.endsWith('-') ) return next

// Если пустая строка - сетим NaN
// Применяем округления.
return this.round( this.value_limited(Number(next || Number.NaN)) )
}

@ $mol_mem
override dec_enabled() : boolean {
return this.enabled() && (
Expand Down