144 lines
3.3 KiB
TypeScript
144 lines
3.3 KiB
TypeScript
/**
|
||
* 股票代码验证工具
|
||
* 用于验证不同市场类型的股票代码格式
|
||
*/
|
||
|
||
/**
|
||
* 市场类型枚举
|
||
*/
|
||
export enum MarketType {
|
||
A = 'A', // A股
|
||
HK = 'HK', // 港股
|
||
US = 'US', // 美股
|
||
ETF = 'ETF', // ETF基金
|
||
LOF = 'LOF' // LOF基金
|
||
}
|
||
|
||
/**
|
||
* 验证A股股票代码
|
||
* @returns 是否为有效的A股代码
|
||
*/
|
||
export const validateAStock = (): boolean => {
|
||
return true;
|
||
};
|
||
|
||
/**
|
||
* 验证港股股票代码
|
||
* @param code 股票代码
|
||
* @returns 是否为有效的港股代码
|
||
*/
|
||
export const validateHKStock = (code: string): boolean => {
|
||
// 港股通常是5位数字
|
||
return /^\d{5}$/.test(code);
|
||
};
|
||
|
||
/**
|
||
* 验证美股股票代码
|
||
* @param code 股票代码
|
||
* @returns 是否为有效的美股代码
|
||
*/
|
||
export const validateUSStock = (code: string): boolean => {
|
||
// 美股代码通常由字母组成,长度在1-5之间
|
||
return /^[A-Za-z]{1,5}$/.test(code);
|
||
};
|
||
|
||
/**
|
||
* 验证ETF/LOF基金代码
|
||
* @param code 基金代码
|
||
* @returns 是否为有效的基金代码
|
||
*/
|
||
export const validateFund = (code: string): boolean => {
|
||
// 基金代码通常为6位数字
|
||
return /^\d{6}$/.test(code);
|
||
};
|
||
|
||
/**
|
||
* 根据市场类型验证股票代码
|
||
* @param code 股票代码
|
||
* @param marketType 市场类型
|
||
* @returns 包含验证结果和错误信息的对象
|
||
*/
|
||
export const validateStockCode = (
|
||
code: string,
|
||
marketType: MarketType
|
||
): { valid: boolean; errorMessage?: string } => {
|
||
|
||
if (!code || code.trim() === '') {
|
||
return {
|
||
valid: false,
|
||
errorMessage: '股票代码不能为空'
|
||
};
|
||
}
|
||
|
||
switch (marketType) {
|
||
case MarketType.A:
|
||
if (!validateAStock()) {
|
||
return {
|
||
valid: false,
|
||
errorMessage: `股票代码不能为空` // A股验证仅检查非空
|
||
};
|
||
}
|
||
break;
|
||
|
||
case MarketType.HK:
|
||
if (!validateHKStock(code)) {
|
||
return {
|
||
valid: false,
|
||
errorMessage: `无效的港股代码格式: ${code}。港股代码应为5位数字`
|
||
};
|
||
}
|
||
break;
|
||
|
||
case MarketType.US:
|
||
if (!validateUSStock(code)) {
|
||
return {
|
||
valid: false,
|
||
errorMessage: `无效的美股代码格式: ${code}。美股代码应为1-5位字母`
|
||
};
|
||
}
|
||
break;
|
||
|
||
case MarketType.ETF:
|
||
case MarketType.LOF:
|
||
if (!validateFund(code)) {
|
||
return {
|
||
valid: false,
|
||
errorMessage: `无效的${marketType}基金代码格式: ${code}。基金代码应为6位数字`
|
||
};
|
||
}
|
||
break;
|
||
|
||
default:
|
||
return {
|
||
valid: false,
|
||
errorMessage: `不支持的市场类型: ${marketType}`
|
||
};
|
||
}
|
||
|
||
return { valid: true };
|
||
};
|
||
|
||
/**
|
||
* 批量验证多个股票代码
|
||
* @param codes 股票代码数组
|
||
* @param marketType 市场类型
|
||
* @returns 包含所有无效代码及其错误信息的数组
|
||
*/
|
||
export const validateMultipleStockCodes = (
|
||
codes: string[],
|
||
marketType: MarketType
|
||
): { code: string; errorMessage: string }[] => {
|
||
const invalidCodes: { code: string; errorMessage: string }[] = [];
|
||
|
||
for (const code of codes) {
|
||
const result = validateStockCode(code, marketType);
|
||
if (!result.valid && result.errorMessage) {
|
||
invalidCodes.push({
|
||
code,
|
||
errorMessage: result.errorMessage
|
||
});
|
||
}
|
||
}
|
||
|
||
return invalidCodes;
|
||
}; |