data_process_ui/app/formatter.py

99 lines
1.9 KiB
Python
Raw Permalink Normal View History

2026-01-12 09:21:42 +08:00
import re
import math
#将弧度转换为度分秒
def rad2dms(r):
d = r * 180 / math.pi
m = (d - int(d)) * 60
d = int(d)
s = (m - int(m)) * 60
m = int(m)
return d, m, s
#将度分秒转换为弧度
def dms2rad(d, m, s):
return (d + m / 60 + s / 360) / 180 * math.pi
class string:
dtype = str
def __init__(self):
pass
def str2val(self, s):
return s
def val2str(self, v):
return v
class integer:
dtype = int
def __init__(self, fmt = "%d"):
self.fmt = fmt
def str2val(self, s):
s = s.strip()
if not s:
return None
try:
v = int(s)
except:
v = int(float(s))
return v
def val2str(self, v):
return self.fmt % v
class decimal:
dtype = float
def __init__(self, fmt = "%.3f", epsilon = 1e-4):
self.fmt = fmt
self.epsilon = epsilon
def str2val(self, s):
s = s.strip()
if not s:
return None
return float(s)
def val2str(self, v):
if abs(v) < self.epsilon:
v = 0.0
return self.fmt % v
class kdecimal:
dtype = float
def __init__(self, fmt = "%07.3f", epsilon = 1e-4):
self.fmt = fmt
self.epsilon = epsilon
def str2val(self, s):
s = s.strip()
if not s:
return None
match = re.match(r"[kK](\d+)\+(\d+(?:\.\d+)?)", s)
if match is None:
raise RuntimeError(f"pattern not matched: {s}")
a = match.group(1)
b = match.group(2)
return float(a + b)
def val2str(self, v):
a = v // 1000
b = v % 1000
if abs(b - 1000) < self.epsilon:
a += 1
b = 0.0
elif abs(b) < self.epsilon:
b = 0.0
return f"K%d+{self.fmt}" % (a, b)
class angle:
dtype = float
def __init__(self):
pass
def str2val(self, s):
s = s.strip()
if not s:
return None
match = re.match(r"(\d+)°(\d+)(\d+(?:\.\d+)?)″", s)
if match is None:
raise RuntimeError(f"pattern not matched: {s}")
d = int(match.group(1))
m = int(match.group(2))
s = float(match.group(3))
return dms2rad(d, m, s)
def val2str(self, v):
return "%2d°%02d%05.2f" % rad2dms(v)