You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
153 lines
3.6 KiB
JavaScript
153 lines
3.6 KiB
JavaScript
|
|
class AbstractSmartDateNumericPart extends AbstractSmartDatePart
|
|
{
|
|
constructor(placeholder, size)
|
|
{
|
|
super(placeholder, false);
|
|
this._numericValue = 0;
|
|
this._size = size;
|
|
}
|
|
|
|
numericValue()
|
|
{
|
|
return this._numericValue;
|
|
}
|
|
|
|
/**
|
|
* @param {Date} date
|
|
* @returns {String}
|
|
*/
|
|
formatDate(date)
|
|
{
|
|
return '';
|
|
}
|
|
|
|
formatValue(value)
|
|
{
|
|
let stringValue = String(this._correctValue(value));
|
|
|
|
if (stringValue === '0') {
|
|
return stringValue;
|
|
}
|
|
|
|
if (stringValue.length > this._size) {
|
|
return stringValue.substring(0, this._size);
|
|
}
|
|
|
|
if (stringValue.length < this._size) {
|
|
return stringValue.padStart(this._size, '0');
|
|
}
|
|
|
|
return stringValue;
|
|
}
|
|
|
|
_correctValue(value)
|
|
{
|
|
return Math.round(value);
|
|
}
|
|
|
|
/**
|
|
* @param {SmartDateCheckState} state
|
|
* @returns {String}
|
|
*/
|
|
scanStringNumber(state)
|
|
{
|
|
let index = state.valueIndex();
|
|
let value = state.value();
|
|
|
|
while (index < value.length && this._isNumericSymbol(value[index])) {
|
|
index++;
|
|
}
|
|
|
|
let stringValue = value.substring(state.valueIndex(), index);
|
|
|
|
state.setValueIndex(index);
|
|
|
|
return stringValue;
|
|
}
|
|
|
|
calculateNumericValue(stringValue, maximalNumber)
|
|
{
|
|
var startIndex = 0;
|
|
var endIndex = 0;
|
|
var numericValue = 0;
|
|
|
|
while (startIndex < stringValue.length && stringValue[startIndex] === 0) {
|
|
startIndex++;
|
|
}
|
|
|
|
endIndex = startIndex;
|
|
|
|
while (endIndex < stringValue.length && numericValue < maximalNumber) {
|
|
numericValue = numericValue * 10 + Number(stringValue[endIndex]);
|
|
endIndex++;
|
|
}
|
|
|
|
if (numericValue > maximalNumber) {
|
|
endIndex--;
|
|
}
|
|
|
|
return Number(stringValue.substring(startIndex, endIndex));
|
|
}
|
|
|
|
/**
|
|
* @param {SmartDateCheckState} state
|
|
* @param {Number} maximalValue
|
|
*/
|
|
scanValue(state, maximalValue)
|
|
{
|
|
let index = state.valueIndex();
|
|
let value = state.value();
|
|
|
|
let numericValue = 0;
|
|
|
|
while (index < value.length && this._isNumericSymbol(value[index]) && numericValue < maximalValue) {
|
|
numericValue = numericValue * 10 + Number(value[index]);
|
|
index++;
|
|
}
|
|
|
|
if (numericValue > maximalValue) {
|
|
index--;
|
|
}
|
|
|
|
let stringValue = value.substring(state.valueIndex(), index);
|
|
|
|
state.setValueIndex(index);
|
|
|
|
return stringValue;
|
|
}
|
|
|
|
_defineParsingState(maximalValue, isAtEnd)
|
|
{
|
|
if (this._numericValue > 0 && (this._parsedValue.length >= this._size || !isAtEnd)) {
|
|
this._state = AbstractSmartDatePart.STATE_COMPLETE;
|
|
return;
|
|
}
|
|
|
|
if (this._numericValue * 10 > maximalValue) {
|
|
this._state = AbstractSmartDatePart.STATE_COMPLETE;
|
|
return;
|
|
}
|
|
|
|
this._state = AbstractSmartDatePart.STATE_INCOMPLETE;
|
|
}
|
|
|
|
_defineCleanValue()
|
|
{
|
|
this._cleanedValue = '';
|
|
|
|
if (this.isNoState()) {
|
|
return;
|
|
}
|
|
|
|
if (this.isComplete()) {
|
|
this._cleanedValue = this.formatValue(this._numericValue);
|
|
return;
|
|
}
|
|
|
|
if (this._parsedValue.length > 0) {
|
|
this._cleanedValue = String(this._numericValue);
|
|
}
|
|
}
|
|
}
|