//////////////////////////////////////////////////////////////////////////////// // // Licensed to the Apache Software Foundation (ASF) under one or more // contributor license agreements. See the NOTICE file distributed with // this work for additional information regarding copyright ownership. // The ASF licenses this file to You under the Apache License, Version 2.0 // (the "License"); you may not use this file except in compliance with // the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //////////////////////////////////////////////////////////////////////////////// package mx.formatters { [ExcludeClass] /** * @private * The StringFormatter class provides a mechanism for displaying * and saving data in the specified format. * The constructor accepts the format and an Array of tokens, * and uses these values to create the data structures to support * the formatting during data retrieval and saving. * *
This class is used internally by other formatters, * and is typically not used directly.
* * @see mx.formatters.DateFormatter */ public class StringFormatter { include "../core/Version.as"; //-------------------------------------------------------------------------- // // Constructor // //-------------------------------------------------------------------------- /** * Constructor. * * @param format String that contains the desired format. * * @param tokens String that contains the character tokens * within the specified format String that is replaced * during data formatting operations. * * @param extractTokenFunc The token * accessor method to call when formatting for display. * The method signature is * value: anything, tokenInfo: {token: id, begin: start, end: finish}. * This method must return a String representation of value * for the specifiedtokenInfo
.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function StringFormatter(format:String, tokens:String,
extractTokenFunc:Function)
{
super();
formatPattern(format, tokens);
extractToken = extractTokenFunc;
}
//--------------------------------------------------------------------------
//
// Variables
//
//--------------------------------------------------------------------------
/**
* @private
*/
private var extractToken:Function;
/**
* @private
*/
private var reqFormat:String;
/**
* @private
*/
private var patternInfo:Array;
//--------------------------------------------------------------------------
//
// Methods
//
//--------------------------------------------------------------------------
/**
* Returns the formatted String using the format, tokens,
* and extraction function passed to the constructor.
*
* @param value String to be formatted.
*
* @return Formatted String.
*
* @langversion 3.0
* @playerversion Flash 9
* @playerversion AIR 1.1
* @productversion Flex 3
*/
public function formatValue(value:Object):String
{
var curTokenInfo:Object = patternInfo[0];
var result:String = reqFormat.substring(0, curTokenInfo.begin) +
extractToken(value, curTokenInfo);
var lastTokenInfo:Object = curTokenInfo;
var n:int = patternInfo.length;
for (var i:int = 1; i < n; i++)
{
curTokenInfo = patternInfo[i];
result += reqFormat.substring(lastTokenInfo.end,
curTokenInfo.begin) +
extractToken(value, curTokenInfo);
lastTokenInfo = curTokenInfo;
}
if (lastTokenInfo.end > 0 && lastTokenInfo.end != reqFormat.length)
result += reqFormat.substring(lastTokenInfo.end);
return result;
}
/**
* @private
* Formats a user-defined pattern String into a more usable object.
*
* @param format String that defines the user-requested pattern.
*
* @param tokens List of valid patttern characters.
*/
private function formatPattern(format:String, tokens:String):void
{
var start:int = 0;
var finish:int = 0;
var index:int = 0;
var tokenArray:Array = tokens.split(",");
reqFormat = format;
patternInfo = [];
var n:int = tokenArray.length;
for (var i:int = 0; i < n; i++)
{
start = reqFormat.indexOf(tokenArray[i]);
if (start >= 0 && start < reqFormat.length)
{
finish = reqFormat.lastIndexOf(tokenArray[i]);
finish = finish >= 0 ? finish + 1 : start + 1;
patternInfo.splice(index, 0,
{ token: tokenArray[i], begin: start, end: finish });
index++;
}
}
patternInfo.sort(compareValues);
}
/**
* @private
*/
private function compareValues(a:Object, b:Object):int
{
if (a.begin > b.begin)
return 1;
else if (a.begin < b.begin)
return -1;
else
return 0;
}
}
}