Skip to content

Instantly share code, notes, and snippets.

@chrisvfritz
Last active March 30, 2020 11:04
Show Gist options
  • Save chrisvfritz/5f0a639590d6e648933416f90ba7ae4e to your computer and use it in GitHub Desktop.
Save chrisvfritz/5f0a639590d6e648933416f90ba7ae4e to your computer and use it in GitHub Desktop.
var currencyValidator = {
format: function (number) {
return (Math.trunc(number * 1000000000000) / 1000000000000).toFixed(2)
},
parse: function (newString, oldNumber) {
var CleanParse = function (value) {
return { value: value }
}
var CurrencyWarning = function (warning, value) {
return {
warning: warning,
value: value,
attempt: newString
}
}
var NotAValidDollarAmountWarning = function (value) {
return new CurrencyWarning(newString + ' is not a valid dollar amount', value)
}
var AutomaticConversionWarning = function (value) {
return new CurrencyWarning(newString + ' was automatically converted to ' + value, value)
}
var newNumber = Number(newString)
var indexOfDot = newString.indexOf('.')
var indexOfE = newString.indexOf('e')
if (isNaN(newNumber)) {
if (
indexOfDot === -1 &&
indexOfE > 0 &&
indexOfE === newString.length - 1 &&
Number(newString.slice(0, indexOfE)) !== 0
) {
return new CleanParse(oldNumber)
} else {
return new NotAValidDollarAmountWarning(oldNumber)
}
}
var newCurrencyString = currencyValidator.format(newNumber)
var newCurrencyNumber = Number(newCurrencyString)
if (newCurrencyNumber === newNumber) {
if (indexOfE !== -1 && indexOfE === newString.length - 2) {
return new AutomaticConversionWarning(newNumber)
} else {
return new CleanParse(newNumber)
}
} else {
return new NotAValidDollarAmountWarning(
newNumber > newCurrencyNumber
? newCurrencyNumber
: oldNumber
)
}
}
}
@simonwu-os
Copy link

@shibamo works now for 33.33.

@rambii
Copy link

rambii commented Mar 24, 2017

I noticed another bug where I enter 1.11 and afterwards add more 1s to the beginning until it will parse to 1111.1
The solution of @shibamo solves it for small numbers, but it will appear again for large numbers.

Thanks for the snippets though :)

@adamcarheden
Copy link

In the interest of shameless self-promotion, I deal with some of those bugs at https://github.com/adamcarheden/html-form-tools. vue-compatible version coming soon (maybe).

@luotianshuai
Copy link

luotianshuai commented Oct 12, 2017

is perfect and practical code, start it ~
i think adding annotation is a great idea! thanks ~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment