ilib
Version:
iLib is a cross-engine library of internationalization (i18n) classes written in pure JS
1 lines • 2.95 kB
JavaScript
var ilib=require("../index.js"),Locale=require("./Locale.js"),LocaleInfo=require("./LocaleInfo.js"),isDigit=require("./isDigit.js"),isSpace=require("./isSpace.js"),Currency=require("./Currency.js"),INumber=function(str,options){var i,stripped="",sync=!0;if(this.locale=new Locale(),this.type="number",options){if(options.locale&&(this.locale="string"==typeof options.locale?new Locale(options.locale):options.locale),options.type)switch(options.type){case"number":case"currency":case"percentage":this.type=options.type}void 0!==options.sync&&(sync=!!options.sync)}else options={sync:!0};isDigit._init(sync,options.loadParams,ilib.bind(this,function(){isSpace._init(sync,options.loadParams,ilib.bind(this,function(){new LocaleInfo(this.locale,{sync:sync,loadParams:options.loadParams,onLoad:ilib.bind(this,function(li){this.li=li,this.decimal=li.getDecimalSeparator();var nativeDecimal=this.li.getNativeDecimalSeparator()||"";switch(typeof str){case"string":var unary=!0,lastNumericChar=0;for(this.str=str||"0",i=i=0;i<this.str.length;i++)unary&&"-"===this.str.charAt(i)?(unary=!1,stripped+=this.str.charAt(i),lastNumericChar=i):isDigit(this.str.charAt(i))?(stripped+=this.str.charAt(i),unary=!1,lastNumericChar=i):this.str.charAt(i)!==this.decimal&&this.str.charAt(i)!==nativeDecimal||(stripped+=".",unary=!1,lastNumericChar=i);this.parsed=this.str.substring(0,lastNumericChar+1),this.value=parseFloat(this._mapToLatinDigits(stripped));break;case"number":this.str=""+str,this.value=str;break;case"object":this.value=parseFloat(str.valueOf()),this.str=""+this.value;break;case"undefined":this.value=0,this.str="0"}switch(this.type){case"percentage":-1!==this.str.indexOf(li.getPercentageSymbol())&&(this.value/=100);break;case"currency":for(stripped="",i=0;i<this.str.length&&!isDigit(this.str.charAt(i))&&!isSpace(this.str.charAt(i));)stripped+=this.str.charAt(i++);if(0===stripped.length){for(;i<this.str.length&&isDigit(this.str.charAt(i))||isSpace(this.str.charAt(i))||"."===this.str.charAt(i)||","===this.str.charAt(i);)i++;for(;i<this.str.length&&!isDigit(this.str.charAt(i))&&!isSpace(this.str.charAt(i));)stripped+=this.str.charAt(i++)}return void new Currency({locale:this.locale,sign:stripped,sync:sync,loadParams:options.loadParams,onLoad:ilib.bind(this,function(cur){this.currency=cur,options&&"function"==typeof options.onLoad&&options.onLoad(this)})})}options&&"function"==typeof options.onLoad&&options.onLoad(this)})})}))}))};INumber.prototype={_mapToLatinDigits:function(str){var digits=this.li.getNativeDigits();if(!digits)return str;for(var digitMap={},i=0;i<digits.length;i++)digitMap[digits[i]]=String(i);var decimal=this.li.getNativeDecimalSeparator();return str.split("").map(function(ch){return ch==decimal?".":digitMap[ch]||ch}).join("")},getLocale:function(){return this.locale},toString:function(){return this.str},getCurrency:function(){return this.currency},valueOf:function(){return this.value}},module.exports=INumber;