nel-neo-thinsdk
Version:
122 lines (106 loc) • 4.14 kB
text/typescript
namespace Neo
{
const D = 100000000;
let _max: Fixed8, _minus: Fixed8, _min: Fixed8, _one: Fixed8, _satoshi: Fixed8;
export class Fixed8 implements IO.ISerializable
{
public static get MaxValue() { return _max || (_max = new Fixed8(new Uint64(0xffffffff, 0x7fffffff))); }
public static get MinusOne() { return _minus || (_minus = new Fixed8(new Uint64(0xffffffff, 0xffffffff))); }
public static get MinValue() { return _min || (_min = new Fixed8(Uint64.MinValue)); }
public static get One() { return _one || (_one = Fixed8.fromNumber(1)); }
public static get Satoshi() { return _satoshi || (_satoshi = new Fixed8(new Uint64(1))); }
public static get Zero() { return Fixed8.MinValue; }
constructor(private data: Uint64)
{
if (data.bits[1] >= 0x80000000 && (data.bits[0] != 0xffffffff || data.bits[1] != 0xffffffff))
throw new RangeError();
}
public add(other: Fixed8): Fixed8
{
let result = this.data.add(other.data);
if (result.compareTo(this.data) < 0)
throw new Error();
return new Fixed8(result);
}
public compareTo(other: Fixed8): number
{
return this.data.compareTo(other.data);
}
public equals(other: Fixed8): boolean
{
return this.data.equals(other.data);
}
public static fromNumber(value: number): Fixed8
{
if (value < 0) throw new RangeError();
value *= D;
if (value >= 0x8000000000000000)
throw new RangeError();
let array = new Uint32Array((new BigInteger(value)).toUint8Array(true, 8).buffer);
return new Fixed8(new Uint64(array[0], array[1]));
}
public getData(): Uint64
{
return this.data;
}
public static max(first: Fixed8, ...others: Fixed8[]): Fixed8
{
for (let i = 0; i < others.length; i++)
if (first.compareTo(others[i]) < 0)
first = others[i];
return first;
}
public static min(first: Fixed8, ...others: Fixed8[]): Fixed8
{
for (let i = 0; i < others.length; i++)
if (first.compareTo(others[i]) > 0)
first = others[i];
return first;
}
public static parse(str: string): Fixed8
{
let dot = str.indexOf('.');
let digits = dot >= 0 ? str.length - dot - 1 : 0;
str = str.replace('.', '');
if (digits > 8)
str = str.substr(0, str.length - digits + 8);
else if (digits < 8)
for (let i = digits; i < 8; i++)
str += '0';
return new Fixed8(Uint64.parse(str));
}
public subtract(other: Fixed8): Fixed8
{
if (this.data.compareTo(other.data) < 0)
throw new Error();
return new Fixed8(this.data.subtract(other.data));
}
public toString(): string
{
let str = this.data.toString();
while (str.length <= 8)
str = '0' + str;
str = str.substr(0, str.length - 8) + '.' + str.substr(str.length - 8);
let e = 0;
for (let i = str.length - 1; i >= 0; i--)
if (str[i] == '0')
e++;
else
break;
str = str.substr(0, str.length - e);
if (str[str.length - 1] == '.')
str = str.substr(0, str.length - 1);
return str;
}
public deserialize(reader: IO.BinaryReader): void
{
//TODO
this.data = reader.readUint64();
}
public serialize(writer: IO.BinaryWriter): void
{
//TODO
writer.writeUint64(this.getData());
}
}
}