diff --git a/src/util/NumberParser.cxx b/src/util/NumberParser.cxx
new file mode 100644
index 000000000..4bb47b310
--- /dev/null
+++ b/src/util/NumberParser.cxx
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2009-2019 Max Kellermann <max.kellermann@gmail.com>
+ * http://www.musicpd.org
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "NumberParser.hxx"
+#include "StringView.hxx"
+#include "Macros.hxx"
+
+#include <algorithm>
+
+int64_t
+ParseInt64(StringView s, const char **endptr_r, int base) noexcept
+{
+	char buffer[32];
+	*std::copy_n(s.data, std::min(s.size, ARRAY_SIZE(buffer) - 1),
+		     buffer) = 0;
+
+	char *endptr;
+	const auto result = ParseInt64(buffer, &endptr, base);
+	if (endptr_r != nullptr)
+		*endptr_r = s.data + (endptr - buffer);
+
+	return result;
+}
diff --git a/src/util/NumberParser.hxx b/src/util/NumberParser.hxx
index d514e9dc9..12a1040ec 100644
--- a/src/util/NumberParser.hxx
+++ b/src/util/NumberParser.hxx
@@ -35,6 +35,8 @@
 #include <stdint.h>
 #include <stdlib.h>
 
+struct StringView;
+
 static inline unsigned
 ParseUnsigned(const char *p, char **endptr=nullptr, int base=10) noexcept
 {
@@ -67,6 +69,9 @@ ParseInt64(const char *p, char **endptr=nullptr, int base=10) noexcept
 	return strtoll(p, endptr, base);
 }
 
+int64_t
+ParseInt64(StringView s, const char **endptr_r=nullptr, int base=10) noexcept;
+
 static inline double
 ParseDouble(const char *p, char **endptr=nullptr) noexcept
 {
diff --git a/src/util/meson.build b/src/util/meson.build
index 98c28eb36..1729d8588 100644
--- a/src/util/meson.build
+++ b/src/util/meson.build
@@ -5,6 +5,7 @@ util = static_library(
   'UTF8.cxx',
   'HexFormat.cxx',
   'MimeType.cxx',
+  'NumberParser.cxx',
   'StringView.cxx',
   'AllocatedString.cxx',
   'TruncateString.cxx',