Language:
JavaScript     Change language:
Pastebin: 70252
Author: AzaToth
Subject: Untitled
Created: 2007-07-02 18:54:50
Download and save
Toggle line numbers
1function sprintf() { 
2    if( arguments.length == 0 ) { 
3        throw "Not enough arguments for sprintf"
4    } 
5    var result = ""
6    var format = arguments[0]
7    var list = []
8 
9    var index = 1; 
10    var current_index = 1; 
11    var flags = {}
12    var in_operator = false
13    var relative = false
14    var precision = false
15    var fixed = false
16    var vector_delimiter = '.'
17 
18 
19    for( var i = 0; i < format.length; ++i ) { 
20        var current_char = format.charAt(i); 
21        if( in_operator ) { 
22            switch( current_char ) { 
23            case 'i'
24                current_char = 'd'
25                break
26            case 'F'
27                current_char = 'f'
28                break
29            case '%'
30            case 'c'
31            case 's'
32            case 'd'
33            case 'u'
34            case 'o'
35            case 'x'
36            case 'e'
37            case 'f'
38            case 'g'
39            case 'X'
40            case 'E'
41            case 'G'
42            case 'b'
43                var value = arguments[current_index]
44                if( vector ) { 
45                    r = value.toString().split( '' ); 
46                    result += value.toString().split('').map( function( value ) { 
47                            return sprintf.format( current_char, value.charCodeAt(), flags ); 
48                        }).join( vector_delimiter ); 
49                } else { 
50                    result += sprintf.format( current_char, value, flags ); 
51                } 
52                if( !fixed ) { 
53                    ++index; 
54                } 
55                current_index = index; 
56                flags = {}
57                relative = false
58                in_operator = false
59                precision = false
60                fixed = false
61                vector = false
62                vector_delimiter = '.'
63                break
64            case 'v'
65                vector = true
66            case ' '
67            case '0'
68            case '-'
69            case '+'
70            case '#'
71                flags[current_char] = true
72                break
73            case '*'
74                relative = true
75                break
76            case '.'
77                precision = true
78                break
79            } 
80            if( /\d/.test( current_char ) ) { 
81                var num = parseInt( format.substr( i ) ); 
82                var len = num.toString().length; 
83                i += len - 1; 
84                var next = format.charAt( i  + 1 ); 
85                if( next == '$' ) { 
86                    if( num <= 0 || num >= arguments.length ) { 
87                        throw "out of bound"
88                    } 
89                    if( relative ) { 
90                        if( precision ) { 
91                            flags['precision'] = arguments[num]
92                            precision = false
93                        } else if( format.charAt( i + 2 ) == 'v' ) { 
94                            vector_delimiter = arguments[num]
95                        }else { 
96                            flags['width'] = arguments[num]
97                        } 
98                        relative = false
99                    } else { 
100                        fixed = true
101                        current_index = num; 
102                    } 
103                    ++i; 
104                } else if( precision ) { 
105                    flags['precision'] = num; 
106                    precision = false
107                } else { 
108                    flags['width'] = num; 
109                } 
110            } else if ( relative && !/\d/.test( format.charAt( i + 1 ) ) ) { 
111                if( precision ) { 
112                    flags['precision'] = arguments[current_index]
113                    precision = false
114                } else if( format.charAt( i + 1 ) == 'v' ) { 
115                    vector_delimiter = arguments[current_index]
116                } else { 
117                    flags['width'] = arguments[current_index]
118                } 
119                ++index; 
120                if( !fixed ) { 
121                    current_index++; 
122                } 
123                relative = false
124            } 
125        } else { 
126            if( current_char == '%' ) { 
127                in_operator = true
128                continue
129            } else { 
130                result += current_char; 
131                continue
132            } 
133        } 
134    } 
135    return result; 
136} 
137 
138sprintf.format = function( type, value, flags ) { 
139    var result; 
140    var prefix = ''
141    var fill = ''
142    var fillchar = ' '
143    switch( type ) { 
144    case '%'
145        result = '%'
146        break
147    case 'c'
148        result = String.fromCharCode( value ); 
149        break
150    case 's'
151        result = value.toString(); 
152        break
153    case 'd'
154        result = parseInt( value ).toString(); 
155        break
156    case 'u'
157        result = Math.abs( parseInt( value ) ).toString(); // it's not correct, but JS lacks unsigned ints 
158        break
159    case 'o'
160        result = (new Number( Math.abs( parseInt( value ) ) ) ).toString(8); 
161        break
162    case 'x'
163        result = (new Number( Math.abs( parseInt( value ) ) ) ).toString(16); 
164        break
165    case 'b'
166        result = (new Number( Math.abs( parseInt( value ) ) ) ).toString(2); 
167        break
168    case 'e'
169        var digits = flags['precision'] ? flags['precision'] : 6; 
170        result = (new Number( value ) ).toExponential( digits ).toString(); 
171        break
172    case 'f'
173        var digits = flags['precision'] ? flags['precision'] : 6; 
174        result = (new Number( value ) ).toFixed( digits ).toString(); 
175    case 'g'
176        var digits = flags['precision'] ? flags['precision'] : 6; 
177        result = (new Number( value ) ).toPrecision( digits ).toString(); 
178        break
179    case 'X'
180        result = (new Number( Math.abs( parseInt( value ) ) ) ).toString(16).toUpperCase(); 
181        break
182    case 'E'
183        var digits = flags['precision'] ? flags['precision'] : 6; 
184        result = (new Number( value ) ).toExponential( digits ).toString().toUpperCase(); 
185        break
186    case 'G'
187        var digits = flags['precision'] ? flags['precision'] : 6; 
188        result = (new Number( value ) ).toPrecision( digits ).toString().toUpperCase(); 
189        break
190    } 
191 
192    if(flags['+'] && parseFloat( value ) > 0 && ['d','e','f','g','E','G'].indexOf(type) != -1 ) { 
193        prefix = '+'
194    } 
195 
196    if(flags[' '] && parseFloat( value ) > 0 && ['d','e','f','g','E','G'].indexOf(type) != -1 ) { 
197        prefix = ' '
198    } 
199 
200    if( flags['#'] && parseInt( value ) != 0 ) { 
201        switch(type) { 
202        case 'o'
203            prefix = '0'
204            break
205        case 'x'
206        case 'X'
207            prefix = '0x'
208            break
209        case 'b'
210            prefix = '0b'
211            break
212        } 
213    } 
214 
215    if( flags['0'] && !flags['-'] ) { 
216        fillchar = '0'
217    } 
218 
219    if( flags['width'] && flags['width'] > ( result.length + prefix.length ) ) { 
220        var tofill = flags['width'] - result.length - prefix.length; 
221        for( var i = 0; i < tofill; ++i ) { 
222            fill += fillchar; 
223        } 
224    } 
225 
226    if( flags['-'] && !flags['0'] ) { 
227        result += fill; 
228    } else { 
229        result = fill + result; 
230    } 
231 
232    return prefix + result; 
233} 
Download and save
Toggle line numbers
Thread:
[70252] Untitled by AzaToth at 2007-07-02 18:54:50
  [77052] qgrt tvilqesp by rawmx nhbdo at 2007-11-12 23:57:48 (diff)
  [92397] giukpfld wcgs by tkdp lkjamtf at 2008-07-24 18:45:57 (diff)
Tip: Click the line numbers to toggle highliting on that line.

Paste followup:

Language:
Author:
Subject:


    Tabstop:     bigger biggest
Note: You can prefix a line with "@@@" to highlight it.