//************************************************************************** // Copyright Sybase, Inc. 1998-1999 // All Rights reserved. // // Sybase, Inc. ("Sybase") claims copyright in this // program and documentation as an unpublished work, versions of // which were first licensed on the date indicated in the foregoing // notice. Claim of copyright does not imply waiver of Sybase's // other rights. // // This code is generated by the PowerBuilder HTML DataWindow generator. // It is provided subject to the terms of the Sybase License Agreement // for use as is, without alteration or modification. // Sybase shall have no obligation to provide support or error correction // services with respect to any altered or modified versions of this code. // // *********************************************************** // ** DO NOT MODIFY OR ALTER THIS CODE IN ANY WAY ** // *********************************************************** // // *************************************************************** // ** IMPLEMENTATION DETAILS SUBJECT TO CHANGE WITHOUT NOTICE. ** // ** DO NOT RELY ON IMPLEMENTATION!!!! ** // *************************************************************** // // Use the public interface only. // Checkout, if this works in all "decimal point is comma" regions // Arnd Schmidt (www.dwox.com) //************************************************************************** function DW_FloatParse(inString) { var result = new DW_NumberClass(); if (DW_parseNumberStringAgainstMask(inString, result, true)) { return result.number; } else return null; } function DW_IntParse(inString) { var result = new DW_NumberClass(); if (DW_parseNumberStringAgainstMask(inString, result, false)) { return result.number; } else return null; } function DW_parseNumberStringAgainstMask(inString, outNumber, bFloat) { var Mask = gMask; var format; var bNegative = false; // try special case first if (Mask == "") // unformatted data { var n = 0; if (bFloat) n = parseFloat(inString); else n = parseInt(inString); if (isNaN(n)) return false; if(outNumber != null) outNumber.number = n; return true; } if (Mask.toLowerCase() == "[currency]") { bFloat = true; if (inString.charAt(0) == DW_negCurrencyFormat.charAt(0)) { format = new DW_NumberEncodingClass(DW_negCurrencyFormat, DWFMT_section_positive); bNegative = true; } else format = new DW_NumberEncodingClass(DW_posCurrencyFormat, DWFMT_section_positive); } else { var semiOffset; semiOffset = Mask.indexOf(";"); if (semiOffset != -1) { format = new DW_NumberEncodingClass(Mask.substring(0, semiOffset), DWFMT_section_positive); Mask = Mask.substring(0, semiOffset); } else format = new DW_NumberEncodingClass(Mask, DWFMT_section_positive); } if(!format.bValid) return false; // Create a new number class var nm = new DW_NumberClass(); var STATESECTION = 0; var STATENUMBER = 1; var STATEDECIMAL = 2; var STATEASIS = 3; var currChar; var charIndex = 0; var state; var prvState; var isInteger = false; var key; // To hold number and strings var nVal; // To store integer value var index = 0; var encodedFormat = format.encodedFormat; var action; while (charIndex < inString.length && index < encodedFormat.length) { // Initialize state = prvState = STATESECTION; key = ""; nVal = 0; // Extract one token from inString do{ currChar = inString.charAt (charIndex); if (state == STATESECTION) { if (currChar == ',') state = STATEDECIMAL; else if (allowInString(currChar, "1234567890+-")) state = STATENUMBER; else state = STATEASIS; } else if (state == STATEDECIMAL) { if(bFloat != true) isInteger = true; key += currChar; charIndex++; state = STATESECTION; // Change state for next char prvState = STATEDECIMAL; } else if(state == STATENUMBER) { if((key == "") && ((currChar == '-') || (currChar == '+'))) { if (currChar == '-') bNegative = true; charIndex++; } else { key += currChar; charIndex++; // Skip comma character if(inString.charAt (charIndex) == '.') { charIndex++; // Next character should be a digit if(!DW_parseIsDigit(inString.charAt (charIndex))) return false; } if (!DW_parseIsDigit(inString.charAt (charIndex))) { state = STATESECTION; // Change state for next char prvState = STATENUMBER; nVal = key - 0; } } } else if (state == STATEASIS) { key += currChar; charIndex++; if (allowInString (inString.charAt (charIndex), "1234567890,+-")) { state = STATESECTION; // Change state for next char prvState = STATEASIS; } } else { return false; // Unspecified error } }while(charIndex < inString.length && state != STATESECTION) // Now extract one token from encode string action = 0; if( index < encodedFormat.length) { action = encodedFormat[index]; index++; } if ((typeof action == "string") && (prvState != STATEASIS)) { // Skip ASIS Format action = encodedFormat[index]; index++; } if ((action == DWFMT_integer || action == DWFMT_integer_comma) && (prvState == STATEDECIMAL)) { // Skip Integer Action action = encodedFormat[index+2]; index+=3; if (action != DWFMT_decimal) return false; } if (typeof action == "string") { if (key != action) return false; } else if(action == DWFMT_decimal) { if (key != ",") return false; } else if(action == DWFMT_integer || action == DWFMT_integer_comma) { numReq = encodedFormat[index]; index ++; numOpt = encodedFormat[index]; index ++; if (!format.bMult100 && (key.length > numReq + numOpt)) return false; nm.number = nVal; } else if (action == DWFMT_fraction) { numReq = encodedFormat[index]; index ++; numOpt = encodedFormat[index]; index ++; if (key.length > numReq + numOpt) return false; var tString = "." + key; nm.number += tString; } } if (bNegative) nm.number *= -1; if(nm.number == 0) nm.number = "0.0" if (format.bMult100) nm.number = nm.number/100.0; if (isInteger) nm.number = Math.floor(nm.number); if(outNumber != null) outNumber.number = nm.number; return true; } // // Number formatting code // var DWFMT_integer_comma = 1; var DWFMT_integer = 2; var DWFMT_fraction = 3; var DWFMT_decimal = 4; var DWFMT_exp_integer_comma = 5; var DWFMT_exp_integer = 6; var DWFMT_exp_fraction = 7; var DWFMT_exp_exp = 8; var DWFMT_exp_sign = 9; var DWFMT_exp_sign_opt = 10; var DWFMT_general = 11; var DWFMT_asis_digit = 12; var DWFMT_type_normal = 1; var DWFMT_type_exp = 2; var DWFMT_type_percent = 3; var DWFMT_type_asis = 4; var DWFMT_section_positive = 0; var DWFMT_section_negative = 1; var DWFMT_section_zero = 2; var DWFMT_section_null = 3; function DW_NumberEncodingClass(inString,section) { var STATE_START = 1; var STATE_LEFTDEC = 2; var STATE_RIGHTDEC = 3; var STATE_TESTASIS = 4; var STATE_ASIS = 5; var index; var currState = STATE_START; var currChar; var encodedFormat = new Array(); var accum = ""; var numInSection; var offset = 0; var bValid = true; // state flags var bOnLeft = true; var bDidLeft = false; var bOnExp = false; var bCommas = false; var reqDigits = 0; var optDigits = 0; var totDigits = 0; var numDecPlaces = 0; // misc variable var nextChar; var nextNextChar; this.encodedFormat = encodedFormat; this.color = ""; this.bMult100 = false; this.maskType = DWFMT_type_normal; this.bGeneral = false; var strLen = inString.length; for (index=0; index <= strLen && bValid; ) { if (index < strLen) currChar = inString.charAt(index); else currChar = ""; if (currState == STATE_START) { // handle keywords if (currChar == "[") { if (accum != "") encodedFormat[offset++] = accum; accum = ""; index++; for (; inString.charAt(index) != "]"; index++) accum += inString.charAt(index); index++; // skip ] var inlineEncoding = null; var keyword = accum.toUpperCase(); if (keyword == "GENERAL") { encodedFormat[offset++] = DWFMT_general; this.bGeneral = true; } else if (keyword == "CURRENCY") { if (section == DWFMT_section_positive || section == DWFMT_section_null) inlineEncoding = new DW_NumberEncodingClass(DW_posCurrencyFormat, section); else if(section == DWFMT_section_negative) inlineEncoding = new DW_NumberEncodingClass(DW_negCurrencyFormat, section); else bValid = false; } else { if (!parseInt(accum)) this.color = accum.toLowerCase(); else this.color = eval(accum); this.keyword = accum; } // if we build another format, inline it into current one if (inlineEncoding != null && inlineEncoding.bValid) { var innerFormat = inlineEncoding.encodedFormat; for (var j=0; j<innerFormat.length; j++) encodedFormat[offset++] = innerFormat[j]; } accum = ""; } else if (currChar == "#") { if (accum != "") encodedFormat[offset++] = accum; accum = ""; if (bOnLeft && bDidLeft) currState = STATE_TESTASIS; else if(bOnLeft) currState = STATE_LEFTDEC; else currState = STATE_RIGHTDEC; // reset accumulators reqDigits = 0; totDigits = 0; optDigits = 0; bCommas = false; } else if (currChar == "0") { if (accum != "") encodedFormat[offset++] = accum; accum = ""; if (bOnLeft && bDidLeft) currState = STATE_TESTASIS; else if(bOnLeft) currState = STATE_LEFTDEC; else currState = STATE_RIGHTDEC; // reset accumulators reqDigits = 0; totDigits = 0; optDigits = 0; bCommas = false; } else if (currChar == ".") { if (accum != "") encodedFormat[offset++] = accum; accum = ""; index++; if (bOnLeft) { encodedFormat[offset++] = DWFMT_decimal; bOnLeft = false; } // we want only 1 period char! else bValid = false; } else if (currChar == "e" || currChar == "E") { accum += currChar; index++; nextChar = inString.charAt(index); nextNextChar = inString.charAt(index+1); if ((nextChar == "-" || nextChar == "+") && (nextNextChar == "#" || nextNextChar == "0")) { bOnExp = true; bOnLeft = false; if (nextChar == "+") encodedFormat[offset++] = DWFMT_exp_sign; else encodedFormat[offset++] = DWFMT_exp_sign_opt; // correct prior encodings for (i=0; i < encodedFormat.length;i++) { if (typeof encodedFormat[i] == "number") { var lastFormat = encodedFormat[i]; if (lastFormat == DWFMT_integer_comma) { encodedFormat[i] = DWFMT_exp_integer_comma; i += 2; } else if (lastFormat == DWFMT_integer) { encodedFormat[i] = DWFMT_exp_integer; i += 2; } else if (lastFormat == DWFMT_fraction) { encodedFormat[i] = DWFMT_exp_fraction; i += 2; } } } } if (this.maskType == DWFMT_type_normal) this.maskType = DWFMT_type_exp; else bValid = false; } else if (currChar == "-") { // we will allow it to be the first char of the negative section if (section == DWFMT_section_negative && offset == 0 && accum == "") { accum += currChar; index++; } else currState = STATE_TESTASIS; } else if (currChar == "%") { accum += currChar; index++; if (this.maskType == DWFMT_type_normal) { this.maskType = DWFMT_type_percent; this.bMult100 = true; } else bValid = false; } else if (currChar == "\\") { index++; accum += inString.charAt(index++); } else if (currChar == "'") { index++; while (index < strLen) { currChar = inString.charAt(index); if (currChar == "'") break; accum += currChar; index++; } // check if we fell off end before finding closing quotes if (index == strLen) bValid = false; index++; // skip trailing ' } else { accum += currChar; index++; } } else if (currState == STATE_LEFTDEC) { nextChar = inString.charAt(index+1); if (currChar == "#") { optDigits++; if(!bOnExp) totDigits++; index++; } else if(currChar == "0") { reqDigits++; if(!bOnExp) totDigits++; index++; } else if(currChar == "," && (nextChar == "#" || nextChar == "0")) { bCommas = true; index++; } else { if (bCommas) encodedFormat[offset++] = DWFMT_integer_comma; else encodedFormat[offset++] = DWFMT_integer; encodedFormat[offset++] = reqDigits; encodedFormat[offset++] = optDigits; currState = STATE_START; } } else if (currState == STATE_RIGHTDEC) { if (currChar == "#") { numDecPlaces++; optDigits++; if(!bOnExp) totDigits++; index++; } else if(currChar == "0") { numDecPlaces++; reqDigits++; if(!bOnExp) totDigits++; index++; } else { if (bOnExp) encodedFormat[offset++] = DWFMT_exp_exp; else encodedFormat[offset++] = DWFMT_fraction; encodedFormat[offset++] = reqDigits; encodedFormat[offset++] = optDigits; currState = STATE_START; } } else if (currState == STATE_TESTASIS) { // convert to asis form for (i=0; i < encodedFormat.length && bValid;i++) { if (typeof encodedFormat[i] == "number") { if (encodedFormat[i] == DWFMT_integer) { encodedFormat[i] = DWFMT_asis_digit; i += 2; } else bValid = false; } } this.maskType = DWFMT_type_asis; currState = STATE_ASIS; } else if (currState == STATE_ASIS) { if (currChar == "#" || currChar == "0") { totDigits++; if (accum != "") encodedFormat[offset++] = accum; accum = ""; encodedFormat[offset++] = DWFMT_asis_digit; encodedFormat[offset++] = 1; // 1 required char encodedFormat[offset++] = 0; // no optional } else accum += currChar; index++; } } if (accum != "") encodedFormat[offset++] = accum; this.totalDigits = totDigits; if (encodedFormat.length == 0 ) bValid = false; this.bValid = bValid; this.numDecPlaces = numDecPlaces; } function DW_NumberClass(number) { if (arguments.length == 0) number = 0.0; this.number = number; } function DW_NumberFormatClass(formatString) { this.negativeFormat = null; this.zeroFormat = null; this.nullFormat = null; // try special case first if (formatString.toLowerCase() == "[currency]") { this.positiveFormat = new DW_NumberEncodingClass(DW_posCurrencyFormat, DWFMT_section_positive); this.negativeFormat = new DW_NumberEncodingClass(DW_negCurrencyFormat, DWFMT_section_negative); this.bValid = this.positiveFormat.bValid && this.negativeFormat.bValid; } else { var bValid = true; var semiOffset; semiOffset = formatString.indexOf(";"); if (semiOffset != -1) { this.positiveFormat = new DW_NumberEncodingClass(formatString.substring(0, semiOffset), DWFMT_section_positive); formatString = formatString.substring(semiOffset+1, formatString.length); semiOffset = formatString.indexOf(";"); if (semiOffset != -1) { this.negativeFormat = new DW_NumberEncodingClass(formatString.substring(0, semiOffset), DWFMT_section_negative); formatString = formatString.substring(semiOffset+1, formatString.length); semiOffset = formatString.indexOf(";"); if (semiOffset != -1) { this.zeroFormat = new DW_NumberEncodingClass(formatString.substring(0, semiOffset), DWFMT_section_zero); this.nullFormat = new DW_NumberEncodingClass(formatString.substring(semiOffset+1, formatString.length), DWFMT_section_null); bValid = bValid && this.nullFormat.bValid; } else this.zeroFormat = new DW_NumberEncodingClass(formatString, DWFMT_section_zero); bValid = bValid && this.zeroFormat.bValid; } else this.negativeFormat = new DW_NumberEncodingClass(formatString, DWFMT_section_negative); bValid = bValid && this.negativeFormat.bValid } else this.positiveFormat = new DW_NumberEncodingClass(formatString, DWFMT_section_positive); this.bValid = bValid && this.positiveFormat.bValid; } } function DW_FormatNumber(formatString, value, control) { var numberFormat = new DW_NumberFormatClass(formatString); var result = ""; var strValue, dotOffset, exponentOffset; var bRequireNegative = false; var bNegative = false; var format; if (numberFormat.bValid) { if (value == null) { if (numberFormat.nullFormat != null) format = numberFormat.nullFormat; else format = null; } else if (value < 0) { bNegative = true; if (numberFormat.negativeFormat != null) format = numberFormat.negativeFormat; else { format = numberFormat.positiveFormat; bRequireNegative = true; // mask will not contain negative } } else if (value > 0) format = numberFormat.positiveFormat; else // == 0 { if (numberFormat.zeroFormat != null) format = numberFormat.zeroFormat; else format = numberFormat.positiveFormat; } // if not format, we just return "" if (format != null) { var index; var encodedFormat = format.encodedFormat; var action; var numReq, numOpt, numDigitsLeft, numDigitsRight, i, commaDigit; var accum; var asIsOffset = 0; if (format.bMult100 && value != null) value *= 100; // round to proper number of decimal places if (value != null && ! format.bGeneral) value = DW_Round (value, format.numDecPlaces); // convert the value to a string if (value != null) strValue = value.toString(); else strValue = ""; // strip off leading minus if (strValue.charAt(0) == "-") strValue = strValue.substring(1,strValue.length); dotOffset = strValue.indexOf("."); if (dotOffset == -1) { numDigitsLeft = strValue.length; numDigitsRight = 0; } else { numDigitsLeft = dotOffset; numDigitsRight = strValue.length - dotOffset - 1; } for (index=0; index < encodedFormat.length ; index++) { action = encodedFormat[index]; if (typeof action == "string") result += action; else if (action == DWFMT_integer_comma) { numReq = encodedFormat[index + 1]; numOpt = encodedFormat[index + 2]; index += 2; if (bRequireNegative) result += "-"; if (numDigitsLeft < numReq) { commaDigit = numReq - 1; for (i=0;i< numReq-numDigitsLeft;i++,commaDigit--) { result += "0"; if (commaDigit % 3 == 0 && commaDigit != 0) result += DW_thousandsChar; } } else commaDigit = numDigitsLeft - 1; for (i=0; i < numDigitsLeft; i++,commaDigit--) { result += strValue.charAt(i); if (commaDigit % 3 == 0 && commaDigit != 0) result += DW_thousandsChar; } } else if (action == DWFMT_integer) { numReq = encodedFormat[index + 1]; numOpt = encodedFormat[index + 2]; index += 2; if (numDigitsLeft < numReq) { for (i=0;i< numReq-numDigitsLeft;i++) result += "0"; } for (i=0; i < numDigitsLeft; i++) result += strValue.charAt(i); } else if (action == DWFMT_fraction) { numReq = encodedFormat[index + 1]; numOpt = encodedFormat[index + 2]; index += 2; for (i=0; i < numDigitsRight; i++) result += strValue.charAt(dotOffset + 1 + i); if (numDigitsRight < numReq) { for (i=0; i < numReq - numDigitsRight; i++) result += "0"; } } else if (action == DWFMT_asis_digit) { numReq = encodedFormat[index + 1]; numReq += encodedFormat[index + 2]; index += 2; for (i=0; i< numReq; i++) { result += strValue.charAt (asIsOffset); asIsOffset++; } } else if (action == DWFMT_decimal) { result += DW_decimalChar; } else if (action == DWFMT_general) { if (value != null) result += value.toString(); } // won't deal with exponents for now else if (action == DWFMT_exp_integer_comma) { } else if (action == DWFMT_exp_integer) { } else if (action == DWFMT_exp_fraction) { } else if (action == DWFMT_exp_exp) { } else if (action == DWFMT_exp_sign) { } else if (action == DWFMT_exp_sign_opt) { } } } } else if ( value != null ) // Simulating a [general] format. result = value.toString(); else result = ""; if (this.bStylePositioning && format && format.bValid) if ( format.color == "" || typeof format.color == "string" ) control.style.color = format.color; else control.style.color = convertToRGB( format.color ); return result; } function DW_Fact(n) { var result = 1; if (n == null) result = null; else { var intN = Math.floor(n); // must be an integer and in range if (intN != n || intN <= 0 || intN >= 171) result = null; else { for (var i = 1; i <= n ; i++) result *= i; } } return result; } function DW_Sign(n) { var result; if (n < 0) result = -1; else if (n == 0) result = 0; else result = 1; return result; } function DW_Truncate(num, decPlaces) { var powTen = Math.pow(10.0,decPlaces); num *= powTen; if (num >= 0) num = Math.floor(num + 0.000000000000005); else num = Math.ceil(num - 0.000000000000005); return num / powTen; }
- Sources
- pb9webeasy
- WebTarget
- Source
- NumberFormat.js
File: NumberFormat.js
Size: 31978
Date: Sat, 08 Dec 2007 15:37:13 +0100
Type: js
Size: 31978
Date: Sat, 08 Dec 2007 15:37:13 +0100
Type: js