📄 number.js
字号:
if(!dojo._hasResource["tests.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["tests.number"] = true;dojo.provide("tests.number");dojo.require("dojo.number");/** * Refer to ICU4J's NumberFormatTest.expect(...) */tests.number.check=function(t,options,sourceInput,expectResult){ tests.number.checkFormatParseCycle(t, t,options,sourceInput,expectResult,false); tests.number.checkParse(t, t,options,expectResult,sourceInput); }/** * Perform a single formatting check or a backward check * backward check:number1 -(formatted)-> string1 -(parsed)-> number2 -(formated)-> string2 * then number should == number2; string1 should == string2 */tests.number.checkFormatParseCycle=function(t,options,sourceInput,expectResult, backwardCheck/*boolean,indicates whether need a backward chain check,like formate->parse->format*/){ if(null != options){ var pattern = options.pattern; var locale = options.locale; //TODO: add more fields } //print("\n"); var str = null==pattern?"default":pattern; //print("pattern:" + str + "| locale:" + locale); //print("input:" + sourceInput); var result = dojo.number.format(sourceInput,options); //print("result:" + result); if(null != expectResult){ t.is(expectResult,result); } if(backwardCheck){ var resultParsed = dojo.number.parse(result,options); //print("resultParsed:" + resultParsed); if(!tests.number._decimalNumberDiff(sourceInput,resultParsed)){ t.is(sourceInput,resultParsed); } var resultParsedReformatted = dojo.number.format(resultParsed,options); //print("resultParsedReformatted:" + resultParsedReformatted); if(!tests.number._decimalNumberDiff(result,resultParsedReformatted)){ t.is(result,resultParsedReformatted); } } }/** * Perform a single parsing check */tests.number.checkParse=function(t,options,sourceInput,expectResult){ var str = "default"; if(null != options && null != options.pattern){ str = options.pattern; } //print("input:" + sourceInput); var result = dojo.number.parse(sourceInput,options); //print("result :" + result); if(null != expectResult){ t.is(expectResult,result); }}/** * //TODO:Round a given number */tests.number.rounding = function(t,number,maxFractionDigits,expected){ var pattern="#0."; for(var i=0; i<maxFractionDigits; i++){pattern += "#";} var result = dojo.number.format(number,{pattern:pattern}); t.is(expected,result); }/** * Run a batch parsing */function runBatchParse(options,dataArray/*array*/,pass/*boolean*/){ var exception = null; var result; var i=0; var str = (null==options.pattern)?"default":options.pattern; //print("\n"); for(; i<dataArray.length; i++){ try{ //print("["+i+"]"+"input:"+dataArray[i]); result = dojo.number.parse(dataArray[i],options); if(isNaN(result)){ throw "\"" + dataArray[i] + "\" is parsed to NaN with pattern " + str; } //print("["+i+"]"+"output:"+result); }catch(e){ exception = e; break; } } if(!pass && (exception == null)) { throw "runBatchParse() - stric parse failed, no exception when parsing illegal data"; }else if(exception != null){ if(!pass && i == 0){ //strict parsing should fail for all the dataArray elements as expected //pass condition for strict parsing return; } throw "runBatchParse() failed: " + exception; }}/** * Check whether the given two numbers differ under the decimal bound * */tests.number._decimalNumberDiff = function(num1,num2){ //TODO: should be more accurate when dojo.number finish rounding in the future var diffBound = 1e-3; var diff = num1 - num2; //print("Math.abs(diff) " + Math.abs(diff)); if(Math.abs(diff) < diffBound ){ return true; }else if(isNaN(Math.abs(diff))){ var s = num1.toString().split(num2); s[1] = s[1].replace(",","0"); s[1] = s[1].replace('\u066b','0'); return (new Number(s[1])< diffBound); } return false; }tests.register("tests.number", [ { // Test formatting and parsing of currencies in various locales pre-built in dojo.cldr // NOTE: we can't set djConfig.extraLocale before bootstrapping unit tests, so directly // load resources here for specific locales: name: "number", setUp: function(){ var partLocaleList = ["en-us", "fr-fr", "de-de"]; for(var i = 0 ; i < partLocaleList.length; i ++){ dojo.requireLocalization("dojo.cldr","number",partLocaleList[i], "zh-cn,zh,ko-kr,pt,en-us,en-gb,de,ja,ja-jp,en,ROOT,en-au,fr,es,ko,zh-tw,it,es-es,de-de"); } }, runTest: function(t){ } }, { name: "format", // old tests runTest: function(t){ t.is("0123", dojo.number.format(123, {pattern: "0000"})); t.is("-12,34,567.890", dojo.number.format(-1234567.89, {pattern: "#,##,##0.000##"})); t.is("-12,34,567.89012", dojo.number.format(-1234567.890123, {pattern: "#,##,##0.000##"})); t.is("(1,234,567.89012)", dojo.number.format(-1234567.890123, {pattern: "#,##0.000##;(#,##0.000##)"})); t.is("(1,234,567.89012)", dojo.number.format(-1234567.890123, {pattern: "#,##0.000##;(#)"})); t.is("50.1%", dojo.number.format(0.501, {pattern: "#0.#%"})); t.is("98", dojo.number.format(1998, {pattern: "00"})); t.is("01998", dojo.number.format(1998, {pattern: "00000"})); t.is("0.13", dojo.number.format(0.125, {pattern: "0.##"})); //NOTE: expects round_half_up, not round_half_even t.is("0.1250", dojo.number.format(0.125, {pattern: "0.0000"})); t.is("0.1", dojo.number.format(0.100004, {pattern: "0.####"})); t.is("-12", dojo.number.format(-12.3, {places:0, locale: "en-us"})); t.is("-1,234,567.89", dojo.number.format(-1234567.89, {locale: "en-us"}));// t.is("-12,34,567.89", dojo.number.format(-1234567.89, {locale: "en-in"})); t.is("-1,234,568", dojo.number.format(-1234567.89, {places:0, locale: "en-us"}));// t.is("-12,34,568", dojo.number.format(-1234567.89, {places:0, locale: "en-in"})); t.is("-1\xa0000,10", dojo.number.format(-1000.1, {places:2, locale: "fr-fr"})); t.is("-1,000.10", dojo.number.format(-1000.1, {places:2, locale: "en-us"})); t.is("-1\xa0000,10", dojo.number.format(-1000.1, {places:2, locale: "fr-fr"})); t.is("-1.234,56", dojo.number.format(-1234.56, {places:2, locale: "de-de"})); t.is("-1,000.10", dojo.number.format(-1000.1, {places:2, locale: "en-us"})); t.is("123.46%", dojo.number.format(1.23456, {places:2, locale: "en-us", type: "percent"})); //rounding t.is("-1,234,568", dojo.number.format(-1234567.89, {places:0, locale: "en-us"}));// t.is("-12,34,568", dojo.number.format(-1234567.89, {places:0, locale: "en-in"})); t.is("-1,000.11", dojo.number.format(-1000.114, {places:2, locale: "en-us"})); t.is("-1,000.11", dojo.number.format(-1000.115, {places:2, locale: "en-us"})); t.is("-1,000.12", dojo.number.format(-1000.116, {places:2, locale: "en-us"})); t.is("-0.00", dojo.number.format(-0.0001, {places:2, locale: "en-us"})); t.is("0.00", dojo.number.format(0, {places:2, locale: "en-us"})); //change decimal places t.is("-1\xa0000,100", dojo.number.format(-1000.1, {places:3, locale: "fr-fr"})); t.is("-1,000.100", dojo.number.format(-1000.1, {places:3, locale: "en-us"})); } }, { name: "parse", // old tests runTest: function(t){ t.is(1000, dojo.number.parse("1000", {locale: "en-us"})); t.is(1000.123, dojo.number.parse("1000.123", {locale: "en-us"})); t.is(1000, dojo.number.parse("1,000", {locale: "en-us"})); t.is(-1000, dojo.number.parse("-1000", {locale: "en-us"})); t.is(-1000.123, dojo.number.parse("-1000.123", {locale: "en-us"})); t.is(-1234567.89, dojo.number.parse("-1,234,567.89", {locale: "en-us"})); t.is(-1234567.89, dojo.number.parse("-1 234 567,89", {locale: "fr-fr"})); t.t(isNaN(dojo.number.parse("-1 234 567,89", {locale: "en-us"}))); t.t(isNaN(dojo.number.parse("10,00", {locale: "en-us"}))); t.t(isNaN(dojo.number.parse("1000.1", {locale: "fr-fr"}))); t.t(isNaN(dojo.number.parse(""))); t.t(isNaN(dojo.number.parse("abcd"))); //test whitespace// t.is(-1234567, dojo.number.parse(" -1,234,567 ", {locale: "en-us"}));// t.t(dojo.number.parse("9.1093826E-31")); t.is(0.501, dojo.number.parse("50.1%", {pattern: "#0.#%"})); t.is(123.4, dojo.number.parse("123.4", {pattern: "#0.#"})); t.is(-123.4, dojo.number.parse("-123.4", {pattern: "#0.#"})); t.is(123.4, dojo.number.parse("123.4", {pattern: "#0.#;(#0.#)"})); t.is(-123.4, dojo.number.parse("(123.4)", {pattern: "#0.#;(#0.#)"})); t.is(null, dojo.number.format("abcd", {pattern: "0000"})); t.is(123, dojo.number.parse("123", {places:0})); t.is(123, dojo.number.parse("123", {places:'0'})); t.is(123.4, dojo.number.parse("123.4", {places:1})); t.is(123.45, dojo.number.parse("123.45", {places:'1,3'})); t.is(123.45, dojo.number.parse("123.45", {places:'0,2'})); } }, { name: "format_icu4j3_6", runTest: function(t){/************************************************************************************************* * Evan:The following test cases are referred from ICU4J 3.6 (NumberFormatTest etc.) * see http://icu.sourceforge.net/download/3.6.html#ICU4J *************************************************************************************************//** * In ICU4J, testing logic for NumberFormat.format() is seperated into * differernt single tese cases. So part of these logic are * collected together in this single method. * * !!Failed cases are as follows: * 1.1234567890987654321234567890987654321 should be formatted as * 1,234,567,890,987,654,321,234,567,890,987,654,321 with all the default parameters, * but got 1.234 instead, may due to the unimplemeted exponent. * 2.\u00a4 and ' are not replaced * with pattern "'*&'' '\u00a4' ''&*' #,##0.00" * 1.0 should be formatted to "*&' Re. '&* 1.00",but got "'*&'' '\u00a4' ''&*' 1.00" instead * etc. * */ //print("test_number_format_icu4j3_6() start.............."); /* !!Failed case, 1.234 returned instead //refer to ICU4J's NumberFormatTest.TestCoverage() var bigNum = 1234567890987654321234567890987654321; var expectResult = "1,234,567,890,987,654,321,234,567,890,987,654,321"; tests.number.checkFormatParseCycle(t, null,bigNum,expectResult,false); */ //in icu4j should throw out an exception when formatting a string, //but it seems dojo.number.format can deal with strings //return 123,456,789 dojo.number.format("123456789"); //!!Failed case, \u00a4 and ' are not replaced /* var options = {pattern:"'*&'' '\u00a4' ''&*' #,##0.00",locale:"en-us"}; tests.number.check(t, options,1.0, "*&' Re. '&* 1.00"); tests.number.check(t, options,-2.0, "-*&' Rs. '&* 2.00"); options = {pattern:"#,##0.00 '*&'' '\u00a4' ''&*'",locale:"en-us"}; tests.number.check(t, options,1.0,"1.00 *&' Re. '&*"); tests.number.check(t, options,-2.0,"-2.00 *&' Rs. '&*"); */ //print("test_number_format_icu4j3_6() end..............\n"); } }, { name: "format_patterns", runTest: function(t){/** * Refer to ICU4J's NumberFormatTest.TestPatterns() which now only coveres us locale */ //print("test_number_format_Patterns() start.............."); var patterns = (["#0.#", "#0.", "#.0", "#"]); var patternsLength = patterns.length; var num = (["0","0", "0.0", "0"]); var options; //icu4j result seems doesn't work as: //var num = (["0","0.", ".0", "0"]); for (var i=0; i<patternsLength; ++i) { options = {pattern:patterns[i]}; tests.number.checkFormatParseCycle(t, options,0,num[i],false); } //!!Failed case //In ICU4J: // unquoted special characters in the suffix are illegal // so "000.000|###" is illegal; "000.000'|###'" is legal //dojo.number.format: // when formatting 1.2 with illegal pattern "000.000|###" // no exception was thrown but got "001.200|###" instead. /* patterns = (["000.000|###","000.000'|###'"]); var exception = false; var result; for(var i = 0; i < patterns.length; i ++){ try{ //"001.200'|###'" is return for "000.000'|###'" //"001.200|###" is return for "000.000|###" result = dojo.number.format(1.2,{pattern:patterns[i]}); print("["+i+"] 1.2 is formatted to " + result + " with pattern " + patterns[i]); }catch(e){ exception = true; } if(exception && i==1){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -