244 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			244 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			Python
		
	
	
	
| #!/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()  |