source: binary-improvements2/7dtd-server-fixes/src/JSON/JSONNumber.cs@ 391

Last change on this file since 391 was 391, checked in by alloc, 2 years ago

Major refactoring/cleanup

File size: 3.2 KB
RevLine 
[154]1using System;
[187]2using System.Text;
[154]3
[325]4namespace AllocsFixes.JSON {
[391]5 public class JsonNumber : JsonValue {
[325]6 private readonly double value;
[154]7
[391]8 public JsonNumber (double _value) {
[351]9 value = _value;
[154]10 }
11
[325]12 public double GetDouble () {
[187]13 return value;
14 }
15
[325]16 public int GetInt () {
17 return (int) Math.Round (value);
[187]18 }
19
[351]20 public override void ToString (StringBuilder _stringBuilder, bool _prettyPrint = false, int _currentLevel = 0) {
21 _stringBuilder.Append (value.ToCultureInvariantString ());
[154]22 }
23
[391]24 public static JsonNumber Parse (string _json, ref int _offset) {
[187]25 //Log.Out ("ParseNumber enter (" + offset + ")");
26 StringBuilder sbNum = new StringBuilder ();
27 StringBuilder sbExp = null;
28 bool hasDec = false;
29 bool hasExp = false;
[351]30 while (_offset < _json.Length) {
31 if (_json [_offset] >= '0' && _json [_offset] <= '9') {
[325]32 if (hasExp) {
[351]33 sbExp.Append (_json [_offset]);
[325]34 } else {
[351]35 sbNum.Append (_json [_offset]);
[325]36 }
[351]37 } else if (_json [_offset] == '.') {
[187]38 if (hasExp) {
[391]39 throw new MalformedJsonException ("Decimal separator in exponent");
[187]40 }
[325]41
42 if (hasDec) {
[391]43 throw new MalformedJsonException ("Multiple decimal separators in number found");
[325]44 }
45
46 if (sbNum.Length == 0) {
[391]47 throw new MalformedJsonException ("No leading digits before decimal separator found");
[325]48 }
49
50 sbNum.Append ('.');
51 hasDec = true;
[351]52 } else if (_json [_offset] == '-') {
[187]53 if (hasExp) {
[325]54 if (sbExp.Length > 0) {
[391]55 throw new MalformedJsonException ("Negative sign in exponent after digits");
[325]56 }
57
[351]58 sbExp.Append (_json [_offset]);
[187]59 } else {
[325]60 if (sbNum.Length > 0) {
[391]61 throw new MalformedJsonException ("Negative sign in mantissa after digits");
[325]62 }
63
[351]64 sbNum.Append (_json [_offset]);
[187]65 }
[351]66 } else if (_json [_offset] == 'e' || _json [_offset] == 'E') {
[325]67 if (hasExp) {
[391]68 throw new MalformedJsonException ("Multiple exponential markers in number found");
[325]69 }
70
71 if (sbNum.Length == 0) {
[391]72 throw new MalformedJsonException ("No leading digits before exponential marker found");
[187]73 }
[325]74
75 sbExp = new StringBuilder ();
76 hasExp = true;
[351]77 } else if (_json [_offset] == '+') {
[187]78 if (hasExp) {
[325]79 if (sbExp.Length > 0) {
[391]80 throw new MalformedJsonException ("Positive sign in exponent after digits");
[325]81 }
82
[351]83 sbExp.Append (_json [_offset]);
[187]84 } else {
[391]85 throw new MalformedJsonException ("Positive sign in mantissa found");
[187]86 }
87 } else {
[391]88 if (!StringParsers.TryParseDouble (sbNum.ToString (), out double number)) {
89 throw new MalformedJsonException ("Mantissa is not a valid decimal (\"" + sbNum + "\")");
[187]90 }
91
92 if (hasExp) {
[391]93 if (!int.TryParse (sbExp.ToString (), out int exp)) {
94 throw new MalformedJsonException ("Exponent is not a valid integer (\"" + sbExp + "\")");
[187]95 }
96
[391]97 number *= Math.Pow (10, exp);
[187]98 }
99
100 //Log.Out ("JSON:Parsed Number: " + number.ToString ());
[391]101 return new JsonNumber (number);
[187]102 }
[325]103
[351]104 _offset++;
[187]105 }
[325]106
[391]107 throw new MalformedJsonException ("End of JSON reached before parsing number finished");
[187]108 }
[389]109
110 public override string AsString => value.ToCultureInvariantString ();
111 public override int AsInt => GetInt ();
112 public override double AsDouble => value;
[154]113 }
[325]114}
Note: See TracBrowser for help on using the repository browser.