source: binary-improvements/7dtd-server-fixes/src/JSON/JSONNumber.cs@ 364

Last change on this file since 364 was 351, checked in by alloc, 6 years ago

Fixed game version compatibility of GamePrefs
Code style cleanup (mostly argument names)

File size: 3.1 KB
RevLine 
[154]1using System;
[187]2using System.Text;
[154]3
[325]4namespace AllocsFixes.JSON {
5 public class JSONNumber : JSONValue {
6 private readonly double value;
[154]7
[351]8 public JSONNumber (double _value) {
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
[351]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) {
39 throw new MalformedJSONException ("Decimal separator in exponent");
40 }
[325]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;
[351]52 } else if (_json [_offset] == '-') {
[187]53 if (hasExp) {
[325]54 if (sbExp.Length > 0) {
[187]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) {
[187]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) {
[187]68 throw new MalformedJSONException ("Multiple exponential markers in number found");
[325]69 }
70
71 if (sbNum.Length == 0) {
[187]72 throw new MalformedJSONException ("No leading digits before exponential marker found");
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) {
[187]80 throw new MalformedJSONException ("Positive sign in exponent after digits");
[325]81 }
82
[351]83 sbExp.Append (_json [_offset]);
[187]84 } else {
85 throw new MalformedJSONException ("Positive sign in mantissa found");
86 }
87 } else {
88 double number;
[325]89 if (!StringParsers.TryParseDouble (sbNum.ToString (), out number)) {
90 throw new MalformedJSONException ("Mantissa is not a valid decimal (\"" + sbNum + "\")");
[187]91 }
92
93 if (hasExp) {
94 int exp;
95 if (!int.TryParse (sbExp.ToString (), out exp)) {
[325]96 throw new MalformedJSONException ("Exponent is not a valid integer (\"" + sbExp + "\")");
[187]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 }
[325]105
[351]106 _offset++;
[187]107 }
[325]108
[187]109 throw new MalformedJSONException ("End of JSON reached before parsing number finished");
110 }
[154]111 }
[325]112}
Note: See TracBrowser for help on using the repository browser.