Exemple #1
0
        public static string sprintf(this string value, params object[] args)
        {
            StringBuilder sb       = new StringBuilder();
            int           chIndex  = 0;
            int           argIndex = 0;

            while (chIndex < value.Length)
            {
                if (value[chIndex] == '%')
                {
                    chIndex++;
                    SprintfFlag flag = SprintfFlag.None;
                    if (chIndex < value.Length && value[chIndex] == '+')
                    {
                        chIndex++;
                        flag = SprintfFlag.WriteSign;
                    }
                    else if (chIndex < value.Length && value[chIndex] == '#')
                    {
                        chIndex++;
                        flag = SprintfFlag.WritePrefix;
                    }
                    else if (chIndex < value.Length && value[chIndex] == '0')
                    {
                        chIndex++;
                        flag = SprintfFlag.PadZeros;
                    }
                    int fieldWidth = 0;
                    while (chIndex < value.Length && char.IsDigit(value[chIndex]))
                    {
                        fieldWidth = 10 * fieldWidth + value[chIndex++] - '0';
                    }
                    int precision = 0;
                    if (chIndex < value.Length && value[chIndex] == '.')
                    {
                        chIndex++;
                        while (chIndex < value.Length && char.IsDigit(value[chIndex]))
                        {
                            precision = 10 * precision + value[chIndex++] - '0';
                        }
                    }
                    string specifier = "";
                    if (chIndex < value.Length)
                    {
                        switch (value[chIndex])
                        {
                        case 'd':
                        case 'i':
                            chIndex++;
                            if (argIndex < args.Length)
                            {
                                sb.Append(FormatNumber((long)TjsBinder.ConvertInternal(args[argIndex++], typeof(long)), fieldWidth, flag, "d"));
                            }
                            break;

                        case 'u':
                            chIndex++;
                            if (argIndex < args.Length)
                            {
                                var uinteger = unchecked ((ulong)(long)TjsBinder.ConvertInternal(args[argIndex++], typeof(long)));
                                if (flag == SprintfFlag.PadZeros)
                                {
                                    sb.Append(uinteger.ToString().PadLeft(fieldWidth, '0'));
                                }
                                else
                                {
                                    sb.Append(uinteger.ToString().PadLeft(fieldWidth, ' '));
                                }
                            }
                            break;

                        case 'o':
                            chIndex++;
                            if (argIndex < args.Length)
                            {
                                var uinteger = unchecked ((ulong)(long)TjsBinder.ConvertInternal(args[argIndex++], typeof(long)));
                                if (flag == SprintfFlag.PadZeros)
                                {
                                    sb.Append(ToOctal(uinteger).PadLeft(fieldWidth, '0'));
                                }
                                else if (flag == SprintfFlag.WritePrefix)
                                {
                                    sb.Append(("0" + ToOctal(uinteger)).PadLeft(fieldWidth, ' '));
                                }
                                else
                                {
                                    sb.Append(ToOctal(uinteger).PadLeft(fieldWidth, ' '));
                                }
                            }
                            break;

                        case 'x':
                        case 'X':
                            if (argIndex < args.Length)
                            {
                                var uinteger = unchecked ((ulong)(long)TjsBinder.ConvertInternal(args[argIndex++], typeof(long)));
                                if (flag == SprintfFlag.PadZeros)
                                {
                                    sb.Append(uinteger.ToString(value[chIndex].ToString()).PadLeft(fieldWidth, '0'));
                                }
                                else if (flag == SprintfFlag.WritePrefix)
                                {
                                    sb.Append(("0x" + uinteger.ToString(value[chIndex].ToString())).PadLeft(fieldWidth, ' '));
                                }
                                else
                                {
                                    sb.Append(uinteger.ToString(value[chIndex].ToString()).PadLeft(fieldWidth, ' '));
                                }
                            }
                            chIndex++;
                            break;

                        case 'e':
                        case 'E':
                        case 'f':
                        case 'g':
                        case 'G':
                            specifier = value[chIndex++].ToString() + precision.ToString();
                            if (argIndex < args.Length)
                            {
                                sb.Append(FormatNumber((double)TjsBinder.ConvertInternal(args[argIndex++], typeof(double)), fieldWidth, flag, specifier));
                            }
                            break;

                        case 'c':
                            chIndex++;
                            if (argIndex < args.Length)
                            {
                                sb.Append(args[argIndex++].ToString().charAt(0).PadLeft(fieldWidth, ' '));
                            }
                            break;

                        case 's':
                            chIndex++;
                            if (argIndex < args.Length)
                            {
                                sb.Append(args[argIndex++].ToString().PadLeft(fieldWidth, ' '));
                            }
                            break;

                        case '%':
                            sb.Append(value[chIndex++]);
                            break;
                        }
                    }
                }
                else
                {
                    sb.Append(value[chIndex++]);
                }
            }
            return(sb.ToString());
        }
Exemple #2
0
 public TjsContext(ScriptDomainManager manager, IDictionary <string, object> options) : base(manager)
 {
     Binder = new TjsBinder();
     DefaultContext.InitializeDefaults(this);
 }