data_process_ui/app/formatter.py
2026-01-12 09:21:42 +08:00

99 lines
1.9 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)