#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ 股票代码格式转换工具类 提供多种股票代码格式之间的转换功能 """ import re from typing import Optional class StockCodeFormatter: """股票代码格式转换器""" def __init__(self): """初始化""" pass def _parse_stock_code(self, stock_code: str) -> tuple: """ 解析股票代码,提取代码和市场信息 Args: stock_code: 输入的股票代码 Returns: tuple: (代码数字, 市场标识) 如 ('688008', 'SH') """ if not stock_code: return None, None stock_code = stock_code.strip().upper() # 处理 688008.SH 格式 if '.' in stock_code: parts = stock_code.split('.') if len(parts) == 2: code, market = parts[0], parts[1] return code, market # 处理 SH688008 格式 elif stock_code.startswith(('SZ', 'SH', 'BJ')): market = stock_code[:2] code = stock_code[2:] return code, market # 处理纯数字 688008 格式 elif stock_code.isdigit(): # 根据数字前缀自动判断市场 if stock_code.startswith(('60', '68')): return stock_code, 'SH' elif stock_code.startswith(('00', '30', '20')): return stock_code, 'SZ' elif stock_code.startswith(('8', '43', '87')): return stock_code, 'BJ' else: return stock_code, None return None, None def to_dot_format(self, stock_code: str) -> Optional[str]: """ 转换为点分格式 (如: 688008.SH) Args: stock_code: 输入的股票代码,支持多种格式 Returns: str: 点分格式的股票代码,如果无法转换则返回None Examples: >>> formatter = StockCodeFormatter() >>> formatter.to_dot_format('SH688008') '688008.SH' >>> formatter.to_dot_format('688008') '688008.SH' >>> formatter.to_dot_format('688008.SH') '688008.SH' """ code, market = self._parse_stock_code(stock_code) if code and market: return f"{code}.{market}" return None def to_prefix_format(self, stock_code: str) -> Optional[str]: """ 转换为前缀格式 (如: SH688008) Args: stock_code: 输入的股票代码,支持多种格式 Returns: str: 前缀格式的股票代码,如果无法转换则返回None Examples: >>> formatter = StockCodeFormatter() >>> formatter.to_prefix_format('688008.SH') 'SH688008' >>> formatter.to_prefix_format('688008') 'SH688008' >>> formatter.to_prefix_format('SH688008') 'SH688008' """ code, market = self._parse_stock_code(stock_code) if code and market: return f"{market}{code}" return None def to_number_only(self, stock_code: str) -> Optional[str]: """ 转换为纯数字格式 (如: 688008) Args: stock_code: 输入的股票代码,支持多种格式 Returns: str: 纯数字格式的股票代码,如果无法转换则返回None Examples: >>> formatter = StockCodeFormatter() >>> formatter.to_number_only('688008.SH') '688008' >>> formatter.to_number_only('SH688008') '688008' >>> formatter.to_number_only('688008') '688008' """ code, market = self._parse_stock_code(stock_code) if code: return code return None def get_market(self, stock_code: str) -> Optional[str]: """ 获取股票代码对应的市场标识 Args: stock_code: 输入的股票代码,支持多种格式 Returns: str: 市场标识 ('SH', 'SZ', 'BJ'),如果无法识别则返回None """ code, market = self._parse_stock_code(stock_code) return market def is_valid_stock_code(self, stock_code: str) -> bool: """ 验证股票代码是否有效 Args: stock_code: 输入的股票代码 Returns: bool: 是否为有效的股票代码 """ code, market = self._parse_stock_code(stock_code) return code is not None and market is not None def batch_convert(self, stock_codes: list, target_format: str = 'dot') -> dict: """ 批量转换股票代码格式 Args: stock_codes: 股票代码列表 target_format: 目标格式 ('dot', 'prefix', 'number') Returns: dict: {原始代码: 转换后代码} 的映射字典 """ result = {} for stock_code in stock_codes: if target_format == 'dot': converted = self.to_dot_format(stock_code) elif target_format == 'prefix': converted = self.to_prefix_format(stock_code) elif target_format == 'number': converted = self.to_number_only(stock_code) else: converted = None result[stock_code] = converted return result def main(): """示例用法""" print("=== 股票代码格式转换工具示例 ===") # 创建格式转换器 formatter = StockCodeFormatter() # 测试用例 test_codes = [ '688008.SH', # 沪市科创板 'SH688008', # 前缀格式 '688008', # 纯数字 '300661.SZ', # 深市创业板 'SZ300661', # 前缀格式 '300661', # 纯数字 '000858.SZ', # 深市主板 '600519.SH', # 沪市主板 '430123.BJ', # 北交所 'BJ430123', # 北交所前缀格式 ] print("\n原始代码 -> 点分格式 -> 前缀格式 -> 纯数字格式 -> 市场") print("-" * 70) for code in test_codes: dot_format = formatter.to_dot_format(code) prefix_format = formatter.to_prefix_format(code) number_format = formatter.to_number_only(code) market = formatter.get_market(code) is_valid = formatter.is_valid_stock_code(code) status = "✓" if is_valid else "✗" print(f"{code:12} -> {dot_format or 'None':12} -> {prefix_format or 'None':12} -> {number_format or 'None':8} -> {market or 'None':4} {status}") # 批量转换示例 print(f"\n=== 批量转换示例 ===") batch_codes = ['SH688008', '300661', 'BJ430123'] dot_results = formatter.batch_convert(batch_codes, 'dot') print("转换为点分格式:") for original, converted in dot_results.items(): print(f" {original} -> {converted}") prefix_results = formatter.batch_convert(batch_codes, 'prefix') print("转换为前缀格式:") for original, converted in prefix_results.items(): print(f" {original} -> {converted}") if __name__ == "__main__": main()