1  
     2  /**
     3   * com.sekati.utils.StringUtils
     4   * @version 1.3.1
     5   * @author jason m horwitz | sekati.com
     6   * Copyright (C) 2007  jason m horwitz, Sekat LLC. All Rights Reserved.
     7   * Released under the MIT License: http://www.opensource.org/licenses/mit-license.php
     8   */
     9   
    10  /**
    11   * Static class wrapping various String utilities.
    12   */
    13  class com.sekati.utils.StringUtils {
    14  
    15  	/**
    16  	 * search for key in string
    17  	 * @param str (String)
    18  	 * @param key (String)
    19  	 * @return Boolean
    20  	 */
    21  	public static function search(str:String, key:String):Boolean {
    22  		return (str.indexOf( key ) <= -1) ? false : true;
    23  	}
    24  
    25  	/**
    26  	 * search for key in string - case insensitive.
    27  	 * @param str (String)
    28  	 * @param key (String)
    29  	 * @return Boolean
    30  	 */	
    31  	public static function searchCaseInsensitive(str:String, key:String):Boolean {
    32  		return StringUtils.search( str.toUpperCase( ), key.toUpperCase( ) );
    33  	}	
    34  
    35  	/**
    36  	 * replace every instance of a string with something else
    37  	 * @param str (String)
    38  	 * @param oldChar (String)
    39  	 * @param newChar (String)
    40  	 * @return String
    41  	 */
    42  	public static function replace(str:String, oldChar:String, newChar:String):String {
    43  		return str.split( oldChar ).join( newChar );
    44  	}
    45  
    46  	/**
    47  	 * remove spaces
    48  	 * @param str (String)
    49  	 * @return String
    50  	 */
    51  	public static function removeSpaces(str:String):String {
    52  		return replace( str, " ", "" );
    53  	}
    54  
    55  	/**
    56  	 * remove tabs
    57  	 * @param str (String)
    58  	 * @return String
    59  	 */
    60  	public static function removeTabs(str:String):String {
    61  		return replace( str, "\t", "" );	
    62  	}	
    63  
    64  	/**
    65  	 * remove spaces at end and beginning of the string only
    66  	 * @param str (String)
    67  	 * @return String
    68  	 */
    69  	public static function trim(str:String):String {
    70  		var index0:Number = 0;
    71  		while (str.charAt( index0 ) == " ") {
    72  			index0++;
    73  		}
    74  		var index1:Number = str.length - 1;
    75  		while (str.charAt( index1 ) == " ") {
    76  			index1--;
    77  		}
    78  		return str.substring( index0, index1 + 1 );
    79  	}
    80  
    81  	/**
    82  	 * remove spaces  tabs, line feeds, carrige returns from string
    83  	 * @param str (String)
    84  	 * @return String
    85  	 */
    86  	public static function xtrim(str:String):String {
    87  		var o:String = new String( );
    88  		var TAB:Number = 9;
    89  		var LINEFEED:Number = 10;
    90  		var CARRIAGE:Number = 13;
    91  		var SPACE:Number = 32;
    92  		for (var i:Number = 0; i < str.length ; i++) {
    93  			if (str.charCodeAt( i ) != SPACE && str.charCodeAt( i ) != CARRIAGE && str.charCodeAt( i ) != LINEFEED && str.charCodeAt( i ) != TAB) {
    94  				o += str.charAt( i );
    95  			}
    96  		}
    97  		return o;
    98  	}
    99  
   100  	/**
   101  	 * trim spaces and camel notate string
   102  	 * @param str (String)
   103  	 * @return String
   104  	 */
   105  	public static function trimCamel(str:String):String {
   106  		var o:String = new String( );
   107  		for (var i:Number = 0; i < str.length ; i++) {
   108  			if (str.charAt( i ) != " ") {
   109  				if (justPassedSpace) {
   110  					o += str.charAt( i ).toUpperCase( );
   111  					justPassedSpace = false;
   112  				} else {
   113  					o += str.charAt( i ).toLowerCase( );
   114  				}
   115  			} else {
   116  				var justPassedSpace:Boolean = true;
   117  			}
   118  		}
   119  		return o;
   120  	}
   121  
   122  	/**
   123  	 * format a number with commas - ie. 10000 -> 10,000
   124  	 * @param inNum (Object) String or Number
   125  	 * @return String
   126  	 */
   127  	public static function commaFormatNumber(inNum:Object):String {
   128  		var tmp:String = String( inNum );
   129  		//step through backwards and insert commas
   130  		var outString:String = "";
   131  		var l:Number = tmp.length;
   132  		for (var i:Number = 0; i < l ; i++) {
   133  			if (i % 3 == 0 && i > 0) {
   134  				//insert commas
   135  				outString = "," + outString;
   136  			}
   137  			outString = tmp.substr( l - (i + 1), 1 ) + outString;
   138  		}
   139  		return outString;		
   140  	}
   141  
   142  	/**
   143  	 * Capitalize the first character in the string.
   144  	 * @param str (String)
   145  	 * @return String
   146  	 */
   147  	 
   148  	public static function firstToUpper(str:String):String {
   149  		return str.charAt( 0 ).toUpperCase( ) + str.substr( 1 );
   150  	}	
   151  
   152  	/**
   153  	 * encode html
   154  	 * @param str (String)
   155  	 * @return String
   156  	 */
   157  	public static function htmlEncode(str:String):String {
   158  		var s:String = str, a:Object = new String( );
   159  		a = s.split( "&" ), 
   160  		s = a.join( "&amp;" );
   161  		a = s.split( " " ), 
   162  		s = a.join( "&nbsp;" );
   163  		a = s.split( "<" ), 
   164  		s = a.join( "&lt;" );
   165  		a = s.split( ">" ), 
   166  		s = a.join( "&gt;" );
   167  		a = s.split( "\"" ), 
   168  		s = a.join( "&quot;" );
   169  		return s;
   170  	}
   171  
   172  	/**
   173  	 * decode html
   174  	 * @param t (String)
   175  	 * @return String
   176  	 */
   177  	public static function htmlDecode(t:String):String {
   178  		t = t.split( "&reg;" ).join( "¨" );
   179  		t = t.split( "&copy;" ).join( "©" );
   180  		t = t.split( "&rsquo;" ).join( "'" );
   181  		t = t.split( "&ldquo;" ).join( "\"" );
   182  		t = t.split( "&rdquo;" ).join( "\"" );
   183  		t = t.split( "&hellip;" ).join( "..." );
   184  		t = t.split( "&middot;" ).join( "*" );
   185  		t = t.split( "&ndash;" ).join( "-" );
   186  		t = t.split( "&trade;" ).join( "(TM)" );
   187  		t = t.split( "&egrave;" ).join( );
   188  		t = t.split( "&eacute;" ).join( "Ž." );
   189  		t = t.split( "&bull;" ).join( "-" );
   190  		t = t.split( "&amp;" ).join( "&" );
   191  		return t;
   192  	}
   193  
   194  	/**
   195  	 * strip the zero off floated numbers
   196  	 * @param n (Number)
   197  	 * @return String
   198  	 */	
   199  	public static function stripZeroOnFloat(n:Number):String {
   200  		var str:String = "";
   201  		var a:Array = String( n ).split( "." );
   202  		if (a.length > 1) {
   203  			str = (a[0] == "0") ? "." + a[1] : String( n );
   204  		} else {
   205  			str = String( n );
   206  		}
   207  		return str;
   208  	}
   209  
   210  	/**
   211  	 * add zero in front of floated number
   212  	 * @param n (Number)
   213  	 * @return String
   214  	 */
   215  	public static function padZeroOnFloat( n:Number ):String {
   216  		return ( n > 1 || n < 0 ) ? String( n ) : ( "0." + String( n ).split( "." )[1] );	
   217  	}
   218  
   219  	/**
   220  	 * Remove scientific notation from very small floats when casting to String.
   221  	 * @param n (Number)
   222  	 * @return String
   223  	 * {@code Usage: 
   224  	 * 	trace( String(0.0000001) ); // returns 1e-7
   225  	 * 	trace( floatToString(0.0000001) ); // returns .00000001
   226  	 * }
   227  	 */
   228  	public static function floatToString(n:Number):String {
   229  		var s:String = String( n );
   230  		return (n < 1 && (s.indexOf( "." ) <= -1 || s.indexOf( "e" ) <= -1)) ? "0." + String( n + 1 ).split( "." )[1] : s;
   231  	}
   232  
   233  	/**
   234  	 * strip the zero off floated numbers and remove Scientific Notation
   235  	 * @param n (Number)
   236  	 * @return String
   237  	 */
   238  	public static function stripZeroAndRepairFloat(n:Number):String {
   239  		var str:String;
   240  		var tmp:String;
   241  		var isZeroFloat:Boolean;
   242  		// +=1 to prevent scientific notation.
   243  		if(n < 1) {
   244  			tmp = String( (n + 1) );
   245  			isZeroFloat = true;
   246  		} else {
   247  			tmp = String( n );
   248  			isZeroFloat = false;	
   249  		}
   250  		// if we have a float strip the zero (or +=1) off!
   251  		var a:Array = tmp.split( "." );
   252  		if (a.length > 1) {
   253  			str = (a[0] == "1" && isZeroFloat == true) ? "." + a[1] : tmp;
   254  		} else {
   255  			str = tmp;
   256  		}
   257  		return str;
   258  	}
   259  
   260  	/**
   261  	 * Generate a set of random characters
   262  	 * @param amount (Number)
   263  	 * @return String
   264  	 */
   265  	public static function randChar(amount:Number):String {
   266  		var str:String = "";
   267  		for(var i:Number = 0; i < amount ; i++) str += chr( Math.round( Math.random( ) * (126 - 33) ) + 33 );
   268  		return str;
   269  	}
   270  
   271  	/**
   272  	 * Generate a set of random LowerCase characters
   273  	 * @param amount (Number)
   274  	 * @return String
   275  	 */	
   276  	public static function randLowerChar(amount:Number):String {
   277  		var str:String = "";
   278  		for(var i:Number = 0; i < amount ; i++) str += chr( Math.round( Math.random( ) * (122 - 97) ) + 97 );
   279  		return str;
   280  	}
   281  
   282  	/**
   283  	 * Generate a set of random Number characters
   284  	 * @param amount (Number)
   285  	 * @return String
   286  	 */		
   287  	public static function randNum(amount:Number):String {
   288  		var str:String = "";
   289  		for(var i:Number = 0; i < amount ; i++) str += chr( Math.round( Math.random( ) * (57 - 48) ) + 48 );
   290  		return str;
   291  	}
   292  
   293  	/**
   294  	 * Generate a set of random Special and Number characters
   295  	 * @param amount (Number)
   296  	 * @return String
   297  	 */		
   298  	public static function randSpecialChar(amount:Number):String {
   299  		var str:String = "";
   300  		for(var i:Number = 0; i < amount ; i++) str += chr( Math.round( Math.random( ) * (64 - 33) ) + 33 );
   301  		return str;
   302  	}	
   303  
   304  	/**
   305  	 * strip html markup tags
   306  	 * @param str (String)
   307  	 * @return String
   308  	 */
   309  	public static function stripTags(str:String):String {
   310  		var s:Array = new Array( );
   311  		var c:Array = new Array( );
   312  		for (var i:Number = 0; i < str.length ; i++) {
   313  			if (str.charAt( i ) == "<") {
   314  				s.push( i );
   315  			} else if (str.charAt( i ) == ">") {
   316  				c.push( i );
   317  			}
   318  		}
   319  		var o:String = str.substring( 0, s[0] );
   320  		for (var j:Number = 0; j < c.length ; j++) {
   321  			o += str.substring( c[j] + 1, s[j + 1] );
   322  		}
   323  		return o;
   324  	}
   325  
   326  	/**
   327  	 * detect html breaks
   328  	 * @param str (String)
   329  	 * @return Boolean
   330  	 */
   331  	public static function detectBr(str:String):Boolean {
   332  		return (str.split( "<br" ).length > 1) ? true : false;
   333  	}
   334  
   335  	/**
   336  	 * convert single quotes to double quotes
   337  	 * @param str (String)
   338  	 * @return String
   339  	 */
   340  	public static function toDoubleQuote(str:String):String {
   341  		var sq:String = "'";
   342  		var dq:String = String.fromCharCode( 34 );
   343  		return str.split( sq ).join( dq );
   344  	}
   345  
   346  	/**
   347  	 * convert double quotes to single quotes
   348  	 * @param str (String)
   349  	 * @return String
   350  	 */
   351  	public static function toSingleQuote(str:String):String {
   352  		var sq:String = "'";
   353  		var dq:String = String.fromCharCode( 34 );
   354  		return str.split( dq ).join( sq );
   355  	}
   356  
   357  	/**
   358  	 * Remove all formatting and return cleaned numbers from string.
   359  	 * @param str (String)
   360  	 * @return String
   361  	 * {@code Usage: 
   362  	 * 	StringUtils.toNumeric("123-123-1234"); // returns 1221231234 
   363  	 * }
   364  	 */
   365  	public static function toNumeric(str:String):String {
   366  		var len:Number = str.length;
   367  		var result:String = "";
   368  		for (var i:Number = 0; i < len ; i++) {
   369  			var code:Number = str.charCodeAt( i );
   370  			if (code >= 48 && code <= 57) {
   371  				result += str.substr( i, 1 );
   372  			}
   373  		}
   374  		return result;
   375  	}
   376  
   377  	private function StringUtils() {
   378  	}	
   379  }