Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ NumberToStringFormat()

static unsafe void System.Number.NumberToStringFormat ( ref ValueStringBuilder sb,
ref NumberBuffer number,
ReadOnlySpan< char > format,
NumberFormatInfo info )
inlinestaticpackage

Definition at line 2817 of file Number.cs.

2818 {
2819 int num = 0;
2820 byte* digitsPointer = number.GetDigitsPointer();
2821 int num2 = FindSection(format, (*digitsPointer == 0) ? 2 : (number.IsNegative ? 1 : 0));
2822 int num3;
2823 int num4;
2824 bool flag;
2825 bool flag2;
2826 int num5;
2827 int num6;
2828 int num9;
2829 while (true)
2830 {
2831 num3 = 0;
2832 num4 = -1;
2833 num5 = int.MaxValue;
2834 num6 = 0;
2835 flag = false;
2836 int num7 = -1;
2837 flag2 = false;
2838 int num8 = 0;
2839 num9 = num2;
2840 fixed (char* ptr = &MemoryMarshal.GetReference(format))
2841 {
2842 char c;
2843 while (num9 < format.Length && (c = ptr[num9++]) != 0)
2844 {
2845 switch (c)
2846 {
2847 case ';':
2848 break;
2849 case '#':
2850 num3++;
2851 continue;
2852 case '0':
2853 if (num5 == int.MaxValue)
2854 {
2855 num5 = num3;
2856 }
2857 num3++;
2858 num6 = num3;
2859 continue;
2860 case '.':
2861 if (num4 < 0)
2862 {
2863 num4 = num3;
2864 }
2865 continue;
2866 case ',':
2867 if (num3 <= 0 || num4 >= 0)
2868 {
2869 continue;
2870 }
2871 if (num7 >= 0)
2872 {
2873 if (num7 == num3)
2874 {
2875 num++;
2876 continue;
2877 }
2878 flag2 = true;
2879 }
2880 num7 = num3;
2881 num = 1;
2882 continue;
2883 case '%':
2884 num8 += 2;
2885 continue;
2886 case '‰':
2887 num8 += 3;
2888 continue;
2889 case '"':
2890 case '\'':
2891 while (num9 < format.Length && ptr[num9] != 0 && ptr[num9++] != c)
2892 {
2893 }
2894 continue;
2895 case '\\':
2896 if (num9 < format.Length && ptr[num9] != 0)
2897 {
2898 num9++;
2899 }
2900 continue;
2901 case 'E':
2902 case 'e':
2903 if ((num9 < format.Length && ptr[num9] == '0') || (num9 + 1 < format.Length && (ptr[num9] == '+' || ptr[num9] == '-') && ptr[num9 + 1] == '0'))
2904 {
2905 while (++num9 < format.Length && ptr[num9] == '0')
2906 {
2907 }
2908 flag = true;
2909 }
2910 continue;
2911 default:
2912 continue;
2913 }
2914 break;
2915 }
2916 }
2917 if (num4 < 0)
2918 {
2919 num4 = num3;
2920 }
2921 if (num7 >= 0)
2922 {
2923 if (num7 == num4)
2924 {
2925 num8 -= num * 3;
2926 }
2927 else
2928 {
2929 flag2 = true;
2930 }
2931 }
2932 if (*digitsPointer != 0)
2933 {
2934 number.Scale += num8;
2935 int pos = (flag ? num3 : (number.Scale + num3 - num4));
2936 RoundNumber(ref number, pos, isCorrectlyRounded: false);
2937 if (*digitsPointer != 0)
2938 {
2939 break;
2940 }
2941 num9 = FindSection(format, 2);
2942 if (num9 == num2)
2943 {
2944 break;
2945 }
2946 num2 = num9;
2947 continue;
2948 }
2949 if (number.Kind != NumberBufferKind.FloatingPoint)
2950 {
2951 number.IsNegative = false;
2952 }
2953 number.Scale = 0;
2954 break;
2955 }
2956 num5 = ((num5 < num4) ? (num4 - num5) : 0);
2957 num6 = ((num6 > num4) ? (num4 - num6) : 0);
2958 int num10;
2959 int num11;
2960 if (flag)
2961 {
2962 num10 = num4;
2963 num11 = 0;
2964 }
2965 else
2966 {
2967 num10 = ((number.Scale > num4) ? number.Scale : num4);
2968 num11 = number.Scale - num4;
2969 }
2970 num9 = num2;
2971 Span<int> span = stackalloc int[4];
2972 int num12 = -1;
2973 if (flag2 && info.NumberGroupSeparator.Length > 0)
2974 {
2975 int[] numberGroupSizes = info._numberGroupSizes;
2976 int num13 = 0;
2977 int i = 0;
2978 int num14 = numberGroupSizes.Length;
2979 if (num14 != 0)
2980 {
2981 i = numberGroupSizes[num13];
2982 }
2983 int num15 = i;
2984 int num16 = num10 + ((num11 < 0) ? num11 : 0);
2985 for (int num17 = ((num5 > num16) ? num5 : num16); num17 > i; i += num15)
2986 {
2987 if (num15 == 0)
2988 {
2989 break;
2990 }
2991 num12++;
2992 if (num12 >= span.Length)
2993 {
2994 int[] array = new int[span.Length * 2];
2995 span.CopyTo(array);
2996 span = array;
2997 }
2998 span[num12] = i;
2999 if (num13 < num14 - 1)
3000 {
3001 num13++;
3002 num15 = numberGroupSizes[num13];
3003 }
3004 }
3005 }
3006 if (number.IsNegative && num2 == 0 && number.Scale != 0)
3007 {
3008 sb.Append(info.NegativeSign);
3009 }
3010 bool flag3 = false;
3011 fixed (char* ptr3 = &MemoryMarshal.GetReference(format))
3012 {
3013 byte* ptr2 = digitsPointer;
3014 char c;
3015 while (num9 < format.Length && (c = ptr3[num9++]) != 0 && c != ';')
3016 {
3017 if (num11 > 0 && (c == '#' || c == '.' || c == '0'))
3018 {
3019 while (num11 > 0)
3020 {
3021 sb.Append((char)((*ptr2 != 0) ? (*(ptr2++)) : 48));
3022 if (flag2 && num10 > 1 && num12 >= 0 && num10 == span[num12] + 1)
3023 {
3024 sb.Append(info.NumberGroupSeparator);
3025 num12--;
3026 }
3027 num10--;
3028 num11--;
3029 }
3030 }
3031 switch (c)
3032 {
3033 case '#':
3034 case '0':
3035 if (num11 < 0)
3036 {
3037 num11++;
3038 c = ((num10 <= num5) ? '0' : '\0');
3039 }
3040 else
3041 {
3042 c = ((*ptr2 != 0) ? ((char)(*(ptr2++))) : ((num10 > num6) ? '0' : '\0'));
3043 }
3044 if (c != 0)
3045 {
3046 sb.Append(c);
3047 if (flag2 && num10 > 1 && num12 >= 0 && num10 == span[num12] + 1)
3048 {
3049 sb.Append(info.NumberGroupSeparator);
3050 num12--;
3051 }
3052 }
3053 num10--;
3054 break;
3055 case '.':
3056 if (!(num10 != 0 || flag3) && (num6 < 0 || (num4 < num3 && *ptr2 != 0)))
3057 {
3058 sb.Append(info.NumberDecimalSeparator);
3059 flag3 = true;
3060 }
3061 break;
3062 case '‰':
3063 sb.Append(info.PerMilleSymbol);
3064 break;
3065 case '%':
3066 sb.Append(info.PercentSymbol);
3067 break;
3068 case '"':
3069 case '\'':
3070 while (num9 < format.Length && ptr3[num9] != 0 && ptr3[num9] != c)
3071 {
3072 sb.Append(ptr3[num9++]);
3073 }
3074 if (num9 < format.Length && ptr3[num9] != 0)
3075 {
3076 num9++;
3077 }
3078 break;
3079 case '\\':
3080 if (num9 < format.Length && ptr3[num9] != 0)
3081 {
3082 sb.Append(ptr3[num9++]);
3083 }
3084 break;
3085 case 'E':
3086 case 'e':
3087 {
3088 bool positiveSign = false;
3089 int num18 = 0;
3090 if (flag)
3091 {
3092 if (num9 < format.Length && ptr3[num9] == '0')
3093 {
3094 num18++;
3095 }
3096 else if (num9 + 1 < format.Length && ptr3[num9] == '+' && ptr3[num9 + 1] == '0')
3097 {
3098 positiveSign = true;
3099 }
3100 else if (num9 + 1 >= format.Length || ptr3[num9] != '-' || ptr3[num9 + 1] != '0')
3101 {
3102 sb.Append(c);
3103 break;
3104 }
3105 while (++num9 < format.Length && ptr3[num9] == '0')
3106 {
3107 num18++;
3108 }
3109 if (num18 > 10)
3110 {
3111 num18 = 10;
3112 }
3113 int value = ((*digitsPointer != 0) ? (number.Scale - num4) : 0);
3114 FormatExponent(ref sb, info, value, c, num18, positiveSign);
3115 flag = false;
3116 break;
3117 }
3118 sb.Append(c);
3119 if (num9 < format.Length)
3120 {
3121 if (ptr3[num9] == '+' || ptr3[num9] == '-')
3122 {
3123 sb.Append(ptr3[num9++]);
3124 }
3125 while (num9 < format.Length && ptr3[num9] == '0')
3126 {
3127 sb.Append(ptr3[num9++]);
3128 }
3129 }
3130 break;
3131 }
3132 default:
3133 sb.Append(c);
3134 break;
3135 case ',':
3136 break;
3137 }
3138 }
3139 }
3140 if (number.IsNegative && num2 == 0 && number.Scale == 0 && sb.Length > 0)
3141 {
3142 sb.Insert(0, info.NegativeSign);
3143 }
3144 }
static unsafe int FindSection(ReadOnlySpan< char > format, int section)
Definition Number.cs:3432
static unsafe void FormatExponent(ref ValueStringBuilder sb, NumberFormatInfo info, int value, char expChar, int minDigits, bool positiveSign)
Definition Number.cs:3298
static unsafe void RoundNumber(ref NumberBuffer number, int pos, bool isCorrectlyRounded)
Definition Number.cs:3379

References System.array, System.Span< T >.CopyTo(), System.Number.FindSection(), System.format, System.Number.FormatExponent(), System.info, System.Span< T >.Length, System.Number.RoundNumber(), and System.value.

Referenced by System.Number.FormatDecimal(), System.Number.FormatDouble(), System.Number.FormatHalf(), System.Number.FormatInt32(), System.Number.FormatInt64(), System.Number.FormatSingle(), System.Number.FormatUInt32(), System.Number.FormatUInt64(), System.Number.TryFormatDecimal(), System.Number.TryFormatInt32(), System.Number.TryFormatInt64(), System.Number.TryFormatUInt32(), and System.Number.TryFormatUInt64().