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

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

Finished up REST API base
Made API handler look for APIs in all loaded mods

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