我知道如何使用util.format()使用%f,%d等格式化字符串。有人能告诉我哪个是从字符串(而不是从控制台输入)启用SCANNING的补充功能。
例如:
...运行
const util = require('util');
var weatherStr = util.format(`The temperature at %d o' clock was %f deg. C and the humidity was %f.`, 5, 23.9, 0.5);
console.log(weatherStr);
... ...生成
The temperature at 5 o' clock was 23.9 deg. C and the humidity was 0.5.
我期待一个util函数可以运行以下代码......
const util = require('util');
var weatherStr = 'The temperature at 5 o' clock was 23.9 deg. C and the humidity was 0.5.';
console.log(util.????(tempStr, `humidity was %f.`));
... ...生成
0.5
这是执行此功能的util函数?我不认为“parseFloat”会起作用,因为它会提取23.9。
我是JS和Node的新手,但我期待一个“扫描”功能。我知道有一个scanf npm库,但它似乎与控制台输入而不是现有字符串一起使用。我一直在JS和Node函数中搜索“%f”,令人惊讶的是,util.format似乎是唯一一个提及它的人。
答案 0 :(得分:1)
我不知道任何类似的扫描库,但您可以使用正则表达式。以下是您可以使用的一些模式:
[+-]?\d+
[+-]?\d+(?:\.\d+)?
如果将它们放在捕获组中,则可以从String#match
返回的数组中访问相应的匹配项:
var weatherStr = "The temperature at 5 o'clock was 23.9 deg. C and the humidity was 0.5.";
console.log(+weatherStr.match(/humidity was ([+-]?\d+(?:\.\d+)?)./)[1]);

您可以创建一个可以处理%d
和%f
的实用程序功能:
function scanf(input, find) {
var pattern = {
"d": "(\\d+)",
"f": "(\\d+(?:\\.\\d+)?)"
};
find = find
// Escape characters for use in RegExp constructor:
.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
// Replace %-patterns
.replace(/((?:\\)*)%([a-z])/g, function (m, a, b) {
return a.length % 4 == 0 && b in pattern ? a + pattern[b] : m;
});
var match = input.match(new RegExp(find));
return match && match.slice(1).map(Number);
}
var weatherStr = "The temperature at 5 o'clock was 23.9 deg. C and the humidity was 0.5.";
console.log(scanf(weatherStr, "humidity was %f"));
console.log(scanf(weatherStr, "at %d o'clock was %f"));

答案 1 :(得分:0)
感谢trincot!
实际上,结果是scanf npm库(https://www.npmjs.com/package/scanf)解决了我的问题。我只是没有读完它。我不得不安装“sscanf”(注意双s)。 sscanf方法(在包页面的底部列出)正如我预期的那样工作。
我很惊讶这个包不是更受欢迎,但这正是我需要的。再次感谢!